我有两个通用功能。在第一个我填写字典,然后调用下一个泛型函数将字典转换为对象。
在这里,我需要返回T
通用对象,而不是指定特定对象。我无法做到这一点。它显示错误:
类型T必须是引用类型才能将其用作参数" T"在通用方法或类型..
public T Fill<T>()
{
Dictionary<string,string> d = new Dictionary<string,string>();
//filled dictionary -----
SomeClass dObject = ToObject<SomeClass>(d);
//[---Here I need to return a dynamic object rather than fixing to SomeClass--]
T dObject = ToObject<T>d); ///* Not able to acheive this *///
return (T)Convert.ChangeType(dObject, typeof(T));
}
private T ToObject<T>(IDictionary<string, string> dict)
where T : class,new()
{
T t = new T();
PropertyInfo[] properties = t.GetType().GetProperties();
//--- code to convert object to dictionary
return t;
}
答案 0 :(得分:1)
由于chop
方法受ToObject
和class
约束,因此您还需要将其与new()
方法相匹配。
Fill
但是,似乎不需要public T Fill<T>() where class, new()
约束,因此您可以根据需要将其删除。
答案 1 :(得分:0)
在这行代码中,您有T
必须是class
的约束,并且必须有无参数构造函数(new
):
private T ToObject<T>(IDictionary<string, string> dict)
where T : class,new()
您的Fill
方法的签名是这样的:
public T Fill<T>()
看到没有约束,这意味着我可以传递struct
或任何其他类型,甚至是没有无参数构造函数的类型。这就是您收到错误的原因。您需要定义相同的约束或比您在ToObject<T>
方法上定义的约束更具体的约束。要解决您的问题,请执行以下操作:
public T Fill<T>() where class, new()
现在Fill<T>
具有相同的约束,所以我只能用具有无参数构造函数的类来调用它。