2

どのように電話しSomeObject.SomeGenericInstanceMethod<T>(T arg)ますか?

ジェネリック メソッドの呼び出しに関する投稿がいくつかありますが、このようなものではありません。問題は、メソッド引数パラメーターがジェネリック パラメーターに制限されていることです。

署名が代わりにあった場合、私はそれを知っています

SomeObject.SomeGenericInstanceMethod<T>(string arg)

次に、 MethodInfo を取得できました

typeof (SomeObject).GetMethod("SomeGenericInstanceMethod", new Type[]{typeof (string)}).MakeGenericMethod(typeof(GenericParameter))

では、通常の引数がジェネリック型の場合、MethodInfo を取得するにはどうすればよいでしょうか? ありがとう!

また、ジェネリック パラメーターに型の制約がある場合とない場合があります。

4

2 に答える 2

11

あなたはそれをまったく同じ方法で行います。

MethodInfo.Invokeを呼び出すと、とにかくすべての引数を渡すobject[]ので、コンパイル時に型を知る必要があるわけではありません。

サンプル:

using System;
using System.Reflection;

class Test
{
    public static void Foo<T>(T item)
    {
        Console.WriteLine("{0}: {1}", typeof(T), item);
    }

    static void CallByReflection(string name, Type typeArg,
                                 object value)
    {
        // Just for simplicity, assume it's public etc
        MethodInfo method = typeof(Test).GetMethod(name);
        MethodInfo generic = method.MakeGenericMethod(typeArg);
        generic.Invoke(null, new object[] { value });
    }

    static void Main()
    {
        CallByReflection("Foo", typeof(object), "actually a string");
        CallByReflection("Foo", typeof(string), "still a string");
        // This would throw an exception
        // CallByReflection("Foo", typeof(int), "oops");
    }
}
于 2011-01-19T17:07:11.963 に答える
2

まったく同じ方法で行いますが、オブジェクトのインスタンスを渡します。

typeof (SomeObject).GetMethod(
       "SomeGenericInstanceMethod", 
        yourObject.GetType())  
                 // Or typeof(TheClass), 
                 // or typeof(T) if you're in a generic method
   .MakeGenericMethod(typeof(GenericParameter))

MakeGenericMethodメソッドでは、メソッドの引数ではなく、ジェネリック型パラメーターのみを指定する必要があります

メソッドを呼び出すときに、後で引数を渡します。ただし、この時点では として渡されているobjectため、これも問題ではありません。

于 2011-01-19T17:07:25.490 に答える