9

我有一个类(我无法修改)可以简化为:

public class Foo<T> {
    public static string MyProperty {
         get {return "Method: " + typeof( T ).ToString(); }
    }
}

我想知道当我只有一个时如何调用此方法System.Type

IE

Type myType = typeof( string );
string myProp = ???;
Console.WriteLinte( myMethodResult );

我试过的:

我知道如何用反射实例化泛型类:

Type myGenericClass = typeof(Foo<>).MakeGenericType( 
    new Type[] { typeof(string) }
);
object o = Activator.CreateInstance( myGenericClass );

但是,由于我使用的是静态属性,因此实例化一个类是否合适?如果我无法编译时间转换,如何访问该方法?(System.Object 没有定义static MyProperty

编辑 我在发布后意识到,我正在使用的类是一个属性,而不是一个方法。我为混乱道歉

4

4 回答 4

6

该方法是静态的,因此您不需要对象的实例。您可以直接调用它:

public class Foo<T>
{
    public static string MyMethod()
    {
        return "Method: " + typeof(T).ToString();
    }
}

class Program
{
    static void Main()
    {
        Type myType = typeof(string);
        var fooType = typeof(Foo<>).MakeGenericType(myType);
        var myMethod = fooType.GetMethod("MyMethod", BindingFlags.Static | BindingFlags.Public);
        var result = (string)myMethod.Invoke(null, null);
        Console.WriteLine(result);
    }
}
于 2012-07-09T14:10:37.550 回答
3

好吧,您不需要实例来调用静态方法:

Type myGenericClass = typeof(Foo<>).MakeGenericType( 
    new Type[] { typeof(string) }
);

可以...然后,简单地说:

var property = myGenericClass.GetProperty("MyProperty").GetGetMethod().Invoke(null, new object[0]);

应该这样做。

于 2012-07-09T14:12:24.033 回答
3
typeof(Foo<>)
    .MakeGenericType(typeof(string))
    .GetProperty("MyProperty")
    .GetValue(null, null);
于 2012-07-09T14:13:57.330 回答
2

你需要这样的东西:

typeof(Foo<string>)
    .GetProperty("MyProperty")
    .GetGetMethod()
    .Invoke(null, new object[0]);
于 2012-07-09T14:09:37.727 回答