【问题标题】:How do I convert from type to generic?如何从类型转换为泛型?
【发布时间】:2015-05-23 05:52:32
【问题描述】:

在那里!

给出的是这个类:

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?!
    }
}

还要提一下:

  • FooMethodFooClass&lt;TFoo&gt; 中有重载,但我只想提供对上述重载的访问权限(签名匹配 - 参数名称除外)
  • returnType object 就足够了
  • 我不能在FooClass 中使FooMethod 通用 - 它应该是一个“旧式”接口,因为它将在反射代码中使用

【问题讨论】:

  • 你想转换还是投射它?
  • @bobby ?? ...我想执行该方法:) ...铸造,转换在其他地方完成...
  • 那么,我完全错过了你的问题的意思,对不起。

标签: c# generics


【解决方案1】:

类似:

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));
    }
}

(在非通用版本中实现)

【讨论】:

  • 我知道减速 :) 它只是一个可选界面,消费者知道减速
  • 啊...只是另一个问题:反射是否支持out
  • @Andreas 是的;为参数创建object[],并将其存储在一个变量中(将此变量传递给Invoke 方法)。调用后,检查数组 - 任何 out/ref 值都应该已更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-17
  • 1970-01-01
  • 2020-06-16
相关资源
最近更新 更多