1. ホーム
  2. c#

[解決済み】Reflection。パラメータを指定してメソッドを呼び出す方法

2022-04-07 10:03:39

質問

私はパラメータを持つリフレクションを介してメソッドを呼び出そうとしている、と私は得る。

オブジェクトがターゲット型と一致しない

パラメータなしでメソッドを呼び出すと、問題なく動作します。以下のコードに基づき、メソッドを呼び出すと Test("TestNoParameters") であれば、問題なく動作します。しかし、もし私が Test("Run") 例外が発生します。私のコードに何か問題があるのでしょうか?

私の当初の目的は、オブジェクトの配列を渡すことでした。 public void Run(object[] options) しかし、これはうまくいかなかったので、もっと単純なもの、例えば文字列を試してみましたが、うまくいきませんでした。

// Assembly1.dll
namespace TestAssembly
{
    public class Main
    {
        public void Run(string parameters)
        { 
            // Do something... 
        }
        public void TestNoParameters()
        {
            // Do something... 
        }
    }
}

// Executing Assembly.exe
public class TestReflection
{
    public void Test(string methodName)
    {
        Assembly assembly = Assembly.LoadFile("...Assembly1.dll");
        Type type = assembly.GetType("TestAssembly.Main");

        if (type != null)
        {
            MethodInfo methodInfo = type.GetMethod(methodName);

            if (methodInfo != null)
            {
                object result = null;
                ParameterInfo[] parameters = methodInfo.GetParameters();
                object classInstance = Activator.CreateInstance(type, null);

                if (parameters.Length == 0)
                {
                    // This works fine
                    result = methodInfo.Invoke(classInstance, null);
                }
                else
                {
                    object[] parametersArray = new object[] { "Hello" };

                    // The invoke does NOT work;
                    // it throws "Object does not match target type"             
                    result = methodInfo.Invoke(methodInfo, parametersArray);
                }
            }
        }
    }
}

解決方法は?

nullパラメータ配列での呼び出しと同様に、"methodInfo" を "classInstance" に変更します。

  result = methodInfo.Invoke(classInstance, parametersArray);