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中实现此代码
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中实现此代码
一种方法是欺骗/解决方法,使其与新的(),并设置整数值的接口:
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方法来创建实例,并与整数初始化它们或任何值,你需要..
如果您可以实现所有类型的实现特定的接口是..
'T'中的'int'字段不能被声明为'readonly'在这种情况下,虽然偶尔需要在构造函数中设置的值(只有)。 –
因此,“欺骗/解决方法”..这是不可能创造这个约束,所以所有的解决方案是解决方法.. –
当然,只是认为这是很重要的缺点指出与每个解决方法,所以OP有一个更好的基础为他/她的决定。如果可以按照您的建议实现该接口,那么您的解决方案当然是一个很好的解决方案,甚至可以进行编译时检查。 –
不幸的是,在当前的C#版本的泛型约束的支持集不允许指定任何[R除了无参数构造函数之外,需要构造函数签名。
完成此操作的唯一方法是使用反射的运行时检查。您可以使用GetType()
method检索T
的Type
实例,然后使用GetConstructors()
检索所有构造函数的ConstructorInfo
实例。使用这些,你可以检查T
中的任何构造函数是否具有所需的签名,否则抛出异常......在你的NewGenerics<T>
类的每个构造函数中。
该解决方案的缺点是只能在运行时检查;它仍然会愉快地编译并且只会在有人尝试创建类的实例时抛出。
不可能,只支持new() –
你想完成什么? – rkrahl
@rkrahl:显然,OP正在寻求一种方法来放置一个通用约束,它需要'T'来构造一个具有'int'值的构造函数。 –