在C#中是否可以使用泛型驱动类的方法需要new,但在整个类中不需要new?
public class Response<T> //not where T:new()
{
public void AddTotal<T>() where T : new()
{
var totaledObject = new T();
// do all the useful stuff I need with the new generic
}
}
我在许多不同的场景中使用这个响应,T并不总是有一个new(),对于那些场景我不会使用AddTotal函数,但是对于一些我想拥有它。这可能吗?
注意: 我知道我可以做一个不同的通用变量名称并将其传递给函数,但这打破了它必须与T类型相同的指示。
答案 0 :(得分:2)
您可以通过将问题推送到调用代码来解决这个问题。添加一个参数,让调用代码提供您需要的对象实例,或让调用代码提供创建对象所需的方法:
public void AddTotal<T>(T totaledObject)
{
// do all the useful stuff I need with totaledObject
}
//call it: AddTotal(new Object())
或
public void AddTotal<T>(Func<T> createObject)
{
var totaledObject = createObject();
// do all the useful stuff I need with the new generic
}
使用此选项的技巧是您不能只将构造函数传递给该对象。您必须在另一个委托中包装调用,这可以使用快速的lambda表达式完成:
AddTotal(() => new Object());
答案 1 :(得分:0)
C#中是否可以使用泛型驱动类的方法 需要新的,但不要求整个班级新的?
仅当您指定了不想要的不同类型参数时。您指定的任何泛型类型参数都存在泛型类型参数约束。由于您希望T
类和方法声明为T
,因此两者都存在约束。
如果你想指定另一个泛型类型参数,你可以像这样做一些hacky:
public class X<T>
{
public void Y<OtherT>() where OtherT : T, new()
{
}
}
因此将OtherT
约束为类中声明的类型T
或派生类型。无法保证该类型的确切匹配。
答案 2 :(得分:0)
您不必将T约束为new()。请允许它。使用&#39;其中T:class,new()&#39;作为你的类约束。你不需要任何方法,因为现在可以使用新的T()。