如何从类型转换为通用?

时间:2010-11-18 14:21:48

标签: c# generics

那里!

给出了这个类:

public static class FooClass<TFoo>
{
    public static TFoo FooMethod(object source)
    {
        // implementation goes here
    }
}

现在我要创建这个类:

public static class FooClass
{
    public static object FooMethod(object source, Type fooType)
    {
        var classType = typeof (FooClass<>).MakeGenericType(fooType);
        var methodInfo = classType.GetMethod("FooMethod", new[]
        {
            typeof (object)
        });
        // WHAT NOW?!
    }
}

还要提到:

  • FooMethod中有FooClass<TFoo>的重载,但我只想访问提到的重载(签名是匹配的 - 除了paramterNames)
  • returnType object将是娴熟的
  • 我无法在FooMethod通用中FooClass - 它应该是一个“旧式”界面,因为它将在反射代码中使用

1 个答案:

答案 0 :(得分:7)

类似的东西:

public static class Foo
{
    public static object FooMethod(object source, Type fooType)
    {
        return typeof(Foo<>).MakeGenericType(fooType)
            .GetMethod("FooMethod").Invoke(null, new object[] { source });
    }
}

然而 - 这种反射在紧密循环中可能会很慢;如果你这么做,我会试图扭转依赖,所以通用代码调用非通用代码:

public static class Foo<TFoo>
{
    public static TFoo FooMethod(object source)
    {
        return (TFoo)Foo.FooMethod(source, typeof(TFoo));
    }
}

(在非通用版本中实现)