C# 如何使方法的返回对象通用?
我需要做一些类似下面代码的事情,但是新的T()不起作用。上面说 “无法创建变量类型T的实例,因为它没有新的()约束。”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
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
};
}