是否有可能让Generic类不需要new()单方法需要new()?

时间:2015-12-19 17:15:13

标签: c# generics

在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类型相同的指示。

3 个答案:

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