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