如何从泛型函数返回动态对象 - 错误

时间:2017-02-03 01:13:58

标签: c# dictionary

我有两个通用功能。在第一个我填写字典,然后调用下一个泛型函数将字典转换为对象。

在这里,我需要返回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;
}

2 个答案:

答案 0 :(得分:1)

由于chop方法受ToObjectclass约束,因此您还需要将其与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>具有相同的约束,所以我只能用具有无参数构造函数的类来调用它。