2

我想从字符串实例化一个泛型类型并完成以下操作:

    private static void APERAK(string content, PartyElement pe, bool reload)
    {
        Type t = typeof(Serializer<>).MakeGenericType(Type.GetType(GetMessageTypeVersion(content)));
        Serializer<t> serializer = new Serializer<t>();
    }

    private static string GetMessageTypeVersion(string content)
    {
        //TODO
        return "APERAK";
    }

但在

Serializer<t> serializer = new Serializer<t>();

它在编译之前说“找不到类型或命名空间名称't'(您是否缺少 using 指令或程序集引用?)”。但我想根据找到的字符串实例化序列化器。我怎样才能做到这一点?

4

3 回答 3

1

您已经一个具有以下内容的泛型类型:

typeof(Serializer<>).MakeGenericType(...);

您需要做的就是实例化它:

object o = ACtivator.CreateInstance(t);

当然,编译器不知道什么是类型t,因此您将无法在没有反射的情况下使用它的方法/属性,因此泛型在这里并不能真正帮助您。您能做的最好的事情是转换为非泛型基类Serializer<>(假设存在)。

于 2013-06-24T14:34:37.660 回答
0

泛型是一种编译时构造。您必须在编译时而不是在运行时知道类型参数是什么。

于 2013-06-24T14:28:52.613 回答
0

所以,好吧,你真的无法获得编译时泛型的所有特性。嗯,还有一些其他的方法。

1)实例化泛型类型并打包为对象,然后使用反射调用方法:

object t = Activator.CreateInstance(type);
var res = (string)type.GetMethod("Do").Invoke(t, new object[] { "abc" });

2)实例化泛型类型并将其转换为动态对象,然后使用它(你失去了智能感知和编译时检查):

dynamic t = Activator.CreateInstance(type);
var res = (string)(t.Do("abc"));

3)创建临时泛型方法并用反射调用它(你有智能感知和编译时检查):

public static string UseSerializer<T>(Serializer<T> s)
{
   return s.Do("abc");
}

然后以这种方式使用它:

var useSerializer = typeof(SomeStaticClass).GetMethod("UseSerializer")
object t = Activator.CreateInstance(type);
var res = useSerializer.Invoke(null, new object[]{t});

此外,这些方法可以按执行时间排序:动态<临时方法<simpleReflection

于 2013-06-24T15:17:40.797 回答