Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使方法的返回对象通用?_C#_.net_Generics_Return Type - Fatal编程技术网

C# 如何使方法的返回对象通用?

C# 如何使方法的返回对象通用?,c#,.net,generics,return-type,C#,.net,Generics,Return Type,我需要做一些类似下面代码的事情,但是新的T()不起作用。上面说 “无法创建变量类型T的实例,因为它没有新的()约束。” BaseDropDown类需要像这样应用new()约束: public class BaseDropDown<T> where T : SomeClass, new() { } public-class-BaseDropDown其中T:SomeClass,new() { } new()约束必须始终最后应用。有关更多详细信息,请参阅。使用反射效果良好: publi

我需要做一些类似下面代码的事情,但是新的T()不起作用。上面说 “无法创建变量类型T的实例,因为它没有新的()约束。”


BaseDropDown
类需要像这样应用
new()
约束:

public class BaseDropDown<T> where T : SomeClass, new()
{
}
public-class-BaseDropDown其中T:SomeClass,new()
{
}

new()
约束必须始终最后应用。有关更多详细信息,请参阅。

使用反射效果良好:

public static T MapToBaseDropDown2<T>(this GenericDropDownData dd) where T : BaseDropDown
{
    T entityDd = (T)Activator.CreateInstance(typeof(T));
    entityDd.Id = dd.Id;
    entityDd.Description = dd.Description;
    return entityDd;
}
public static T MapToBaseDropDown2(此GenericDropDownData dd),其中T:BaseDropDown
{
T entityDd=(T)Activator.CreateInstance(typeof(T));
entityDd.Id=dd.Id;
实体详细描述=详细描述;
返回实体dd;
}
调用
new T()
假设每种类型都有一个无参数构造函数,这里的情况似乎不是这样。即使您的基类
BaseDropDown
有这样一个构造函数,但它的所有子类(特别是抽象类)都没有得到保证:

class BaseDropDown
{
    public BaseDropDown() { /* see parameterless-constructor exists */ }
}
abstract class MyClass : BaseDropDown
{
    public MyClass() { ... }
}
现在,您可以使用
new
-约束来排除抽象类:

public static T MapToBaseDropDown2<T>(this GenericDropDownData dd) where T : BaseDropDown, new()
public static T MapToBaseDropDown2(此GenericDropDownData dd),其中T:BaseDropDown,new()

该约束只允许继承
BaseDropDown
并可使用无参数构造函数实例化的类。

这同样有效,只需将
new()
约束直接添加到T(而不是BaseDropDown)

public static T MapToBaseDropDown3(此GenericDropDownData dd),其中T:BaseDropDown,new()
{
返回新的T()
{
Id=dd.Id,
描述=详细描述
};
}

Google“新约束”-查找答案:什么是
BaseDropDown
?显示它是如何定义的。这是因为您的扩展方法可能应用于没有构造函数、非公共构造函数或具有所需参数的构造函数的类。使用
new()
约束,您将确保使用您的方法的实例有一个没有任何参数的公共构造函数。@HimBromBeere我刚刚添加了BaseDropDown是什么
BaseDropDown
似乎不是泛型的,但是
MapToBaseDropDown2
是。您应该使用
new()
约束,而不是这种技术。这样,如果您尝试使用缺少无参数构造函数的
T
执行此操作,它将在编译时失败。您的代码将编译良好,但在运行时失败。
class BaseDropDown
{
    public BaseDropDown() { /* see parameterless-constructor exists */ }
}
abstract class MyClass : BaseDropDown
{
    public MyClass() { ... }
}
public static T MapToBaseDropDown2<T>(this GenericDropDownData dd) where T : BaseDropDown, new()
public static T MapToBaseDropDown3<T>(this GenericDropDownData dd) where T : BaseDropDown, new()
{
    return new T()
    {
        Id = dd.Id,
        Description = dd.Description
    };
}