代码之家  ›  专栏  ›  技术社区  ›  Andreas Niedermair

如何从类型转换为泛型?

  •  2
  • Andreas Niedermair  · 技术社区  · 14 年前

    喂!

    给定的是这个类:

    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> ,但我只想授予对上述重载的访问权限(签名匹配-parameternames除外)
    • 返回类型 object 会很成功的
    • 我做不到 食品法 在里面 FooClass 泛型-它应该是一个“oldstyle”接口,因为它将从反射代码中使用
    1 回复  |  直到 9 年前
        1
  •  9
  •   Marc Gravell    14 年前

    类似于:

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

    (在非通用版本中实现)