如何从类型转换为通用?

And*_*air 3 c# generics

那里!

给出这个类:

public static class FooClass<TFoo>
{
    public static TFoo FooMethod(object source)
    {
        // implementation goes here
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我想创建这个类:

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?!
    }
}
Run Code Online (Sandbox Code Playgroud)

还要提到:

  • 也有重载FooMethodFooClass<TFoo>,但我只是想给访问中提到过载(签名匹配-除了paramterNames)
  • returnType object将是succifient
  • 我不能让FooMethodFooClass通用的-它应该是一个"旧式"的界面,因为它会从反射代码中使用

Mar*_*ell 9

就像是:

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

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

public static class Foo<TFoo>
{
    public static TFoo FooMethod(object source)
    {
        return (TFoo)Foo.FooMethod(source, typeof(TFoo));
    }
}
Run Code Online (Sandbox Code Playgroud)

(在非通用版本中实现)

  • @Andreas是的; 为参数创建`object []`,并将其存储在变量中(将此变量传递给`Invoke`方法).调用之后,检查数组 - 应该更新任何`out` /`ref`值. (2认同)