繁体   English   中英

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

[英]How to return a dynamic object from a generic function - error

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

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

由于ToObject方法受classnew()约束,因此您还需要将其与Fill方法匹配。

public T Fill<T>() where class, new()

但是,似乎不需要class约束,因此可以根据需要将其删除。

在这行代码中,您有一个约束,即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>具有相同的约束,因此我只能使用具有无参数构造函数的类来调用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM