使用字符串名称为泛型参数构造类

时间:2014-04-30 22:41:06

标签: c# generics

我有一个Json deserialiser类,使用如下通用参数创建:

Deserializer<T> results = Deserializer<T>.FromFile(file);

其中T是任意数量类型实现的接口。

我希望T以字符串的形式通过类的名称来选择,例如&#34; Person&#34; 而Person类实现了T。

所以它可以这样写:

Deserializer<Type.GetType("Person")> results = Deserializer<Type.GetType("Person")>.FromFile(file);

我上面已经尝试了这个并且它给了我一个错误:

Using the generic type 'Deserializer<T>' requires 1 type arguments

我也看过这个

http://social.msdn.microsoft.com/Forums/en-US/80690cd9-d1f2-4888-9c95-62305de9ced4/using-typegettype-with-generics

但尝试使用其中一些导致其他错误,例如:

randomVariable is a 'field' but is used like a 'type'

我的代码中是否有错误,或者我的方法是错误的?

我怎样才能让它发挥作用?

解决方案 我的最终代码是

        Type genericType = typeof(Deserializer<>);
        Type[] typeArgs = {Type.GetType("Person")};
        Type deserialiserType = genericType.MakeGenericType(typeArgs);
        object repository = Activator.CreateInstance(deserialiserType);

        MethodInfo genericMethod = deserialiserType.GetMethod("FromFile");
        genericMethod.Invoke(repository, new[] {file});

谢谢大家的帮助

4 个答案:

答案 0 :(得分:2)

这是错误的方法,因为泛型字段需要类型而不是Type类的对象。

然而,已经有了解决方案。 How do I create a generic class from a string in C#?

答案 1 :(得分:2)

使用应用于代码的ModiX链接中的答案,应该会产生以下结果:

Type genericType = typeof(Deserializer<>);
Type[] typeArgs = { Type.GetType("Person") };
Type deserializerType = genericType.MakeGenericType(typeArgs);

object deserializer = Activator.CreateInstance(deserializerType);

MethodInfo fromFileMethod = deserializerType.GetMethod("FromFile");
fromFileMethod.Invoke(deserializer, new[] { file });

该行

MethodInfo closedMethod = genericMethod.MakeGenericMethod(typeof(Something));
如果您的方法是通用的,则使用

,如果它看起来像这样:

Deserializer<T>.FromFile<T2>(...)

答案 2 :(得分:0)

通用参数必须是&#34;真实的类型名称&#34;,因为它们应该在构建时可以解析。

Type.GetType是一种运行时方法。

您有很多选择,例如:

这将使您能够使用运行时类型。

  • 查看解串器是否可以&#34;自动&#34;反序列化为良好类型的实例(在对象中加框)并将其强制转换为预期类型。

  • 根据要反序列化的数据,使用良好的通用参数更改您的实现以调用Deserializer。

答案 3 :(得分:0)

我相信你试图做的是实现这个:

public interface Dynamic <T>
{
     T GetObject(string derserialize);
}

所以基本上你的类会继承Dynamic,在那一刻定义你的泛型类型。然后你基本上隐式显式实现方法GetObject。它会接受您的JSON数据,然后您可以执行所需的逻辑,将其作为您选择的类型返回。