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 一起编译?
一种方法是作弊/解决方法,并使用 new() 和一个设置整数值的接口:
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 方法创建实例并使用整数或您需要的任何值初始化它们。
如果您可以强制所有类型都实现特定的接口,那就是..
不幸的是,当前 C# 版本中支持的通用约束集不允许指定除无参数构造函数之外的任何必需的构造函数签名。
实现这一点的唯一方法是使用反射进行运行时检查。您可以使用该GetType()
方法检索T
的Type
实例,然后用于GetConstructors()
检索ConstructorInfo
所有构造函数的实例。使用这些,您可以检查其中的任何构造函数是否T
具有所需的签名,否则抛出异常......在您的NewGenerics<T>
类的每个构造函数中。
这个解决方案的缺点是它只在运行时检查;它仍然会愉快地编译,并且只有在有人尝试创建您的类的实例时才抛出。