是否可以有一个不需要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.类型相同的指示。

是否可以有一个不需要new()的Generic类,而只有一个方法需要new()

您可以通过将问题推送给调用代码来解决这个问题。添加一个参数,让调用代码提供您需要的对象实例,或者让调用代码为您提供创建对象所需的方法:

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()。