我有一个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
我也看过这个
但尝试使用其中一些导致其他错误,例如:
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});
谢谢大家的帮助
答案 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是一种运行时方法。
您有很多选择,例如:
如果您完全需要传递存储在字符串中的类型,您可以通过反射实例化整个反序列化器:http://msdn.microsoft.com/en-us/library/vstudio/b8ytshk6%28v=vs.100%29.aspx
看看你是否可以在反序列化器的参数中传递类型实例:
Deserializer.FromFile(file,Type.GetType(&#34; person&#34;));
这将使您能够使用运行时类型。
查看解串器是否可以&#34;自动&#34;反序列化为良好类型的实例(在对象中加框)并将其强制转换为预期类型。
根据要反序列化的数据,使用良好的通用参数更改您的实现以调用Deserializer。
答案 3 :(得分:0)
我相信你试图做的是实现这个:
public interface Dynamic <T>
{
T GetObject(string derserialize);
}
所以基本上你的类会继承Dynamic
,在那一刻定义你的泛型类型。然后你基本上隐式或显式实现方法GetObject
。它会接受您的JSON数据,然后您可以执行所需的逻辑,将其作为您选择的类型返回。