是否可以有一个不需要new()的Generic类,而只有一个方法需要new()
本文关键字:有一个 new 方法 不需要 是否 Generic | 更新日期: 2023-09-27 18:27:36
在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.类型相同的指示。
您可以通过将问题推送给调用代码来解决这个问题。添加一个参数,让调用代码提供您需要的对象实例,或者让调用代码为您提供创建对象所需的方法:
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());
在C#中有可能有一个泛型驱动类的方法吗要求新的,但不要求整个班级都有新的?
仅当您指定不同的类型参数时,而您不希望这样做。您指定的任何泛型类型参数都存在泛型类型参数约束。由于您希望类和方法声明的T
是相同的T
,因此两者都将存在约束。
如果你想指定另一个通用类型参数,你可以做一些像这样的技巧:
public class X<T>
{
public void Y<OtherT>() where OtherT : T, new()
{
}
}
从而将CCD_ 3约束为在类中声明的类型CCD_。无法保证在类型上会有完全匹配。
您不必将t约束为new()。只要允许就行了。使用'where T:class,new()'作为类约束。您不需要对该方法进行任何操作,因为现在可以使用新的t()。