2012-09-27 28 views
1
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace Test1 
{ 
    public class NewGenerics<T> where T:new(int) 
    { 

    } 
} 

如何正确编写此代码以便与C#5.0编译?如何在C#5.0中实现此代码

+4

不可能,只支持new() –

+3

你想完成什么? – rkrahl

+1

@rkrahl:显然,OP正在寻求一种方法来放置一个通用约束,它需要'T'来构造一个具有'int'值的构造函数。 –

回答

1

一种方法是欺骗/解决方法,使其与新的(),并设置整数值的接口:

namespace Test1 
{ 
    public class NewGenerics<T> where T: IMyInterface, new() 
    { 
     private static T Create(int theInteger) 
     { 
       var inst = new T(); 
       inst.SetTheInteger(theInteger); 
       return inst; 
     } 


     .... 
    } 
} 

你可以使用Create方法来创建实例,并与整数初始化它们或任何值,你需要..

如果您可以实现所有类型的实现特定的接口是..

+0

'T'中的'int'字段不能被声明为'readonly'在这种情况下,虽然偶尔需要在构造函数中设置的值(只有)。 –

+0

因此,“欺骗/解决方法”..这是不可能创造这个约束,所以所有的解决方案是解决方法.. –

+0

当然,只是认为这是很重要的缺点指出与每个解决方法,所以OP有一个更好的基础为他/她的决定。如果可以按照您的建议实现该接口,那么您的解决方案当然是一个很好的解决方案,甚至可以进行编译时检查。 –

1

不幸的是,在当前的C#版本的泛型约束的支持集不允许指定任何[R除了无参数构造函数之外,需要构造函数签名。

完成此操作的唯一方法是使用反射的运行时检查。您可以使用GetType() method检索TType实例,然后使用GetConstructors()检索所有构造函数的ConstructorInfo实例。使用这些,你可以检查T中的任何构造函数是否具有所需的签名,否则抛出异常......在你的NewGenerics<T>类的每个构造函数中。

该解决方案的缺点是只能在运行时检查;它仍然会愉快地编译并且只会在有人尝试创建类的实例时抛出。