我想创建一个简单的工厂类来实现这样的接口:
IFactory
{
TEntity CreateEmpty<TEntity>();
}
在这个方法中,我想返回一个TEntity类型的实例(泛型类型)。 例如:
TestClass test = new Factory().CreateEmpty<TestClass>();
有可能吗?界面是否正确?
我尝试过这样的事情:
private TEntity CreateEmpty<TEntity>() {
var type = typeof(TEntity);
if(type.Name =="TestClass") {
return new TestClass();
}
else {
...
}
}
但它没有编译。
答案 0 :(得分:6)
您需要在泛型类型参数
上指定new()
约束
public TEntity CreateEmpty<TEntity>()
where TEntity : new()
{
return new TEntity();
}
新约束指定所使用的具体类型必须具有公共默认构造函数,即不带参数的构造函数。
public TestClass
{
public TestClass ()
{
}
...
}
如果你根本没有指定任何构造函数,那么默认情况下该类将有一个公共默认构造函数。
您无法在new()
约束中声明参数。如果您需要传递参数,则必须为此目的声明专用方法,例如通过定义适当的接口
public interface IInitializeWithInt
{
void Initialize(int i);
}
public TestClass : IInitializeWithInt
{
private int _i;
public void Initialize(int i)
{
_i = i;
}
...
}
在你的工厂
public TEntity CreateEmpty<TEntity>()
where TEntity : IInitializeWithInt, new()
{
TEntity obj = new TEntity();
obj.Initialize(1);
return obj;
}
答案 1 :(得分:2)
interface IFactory<TEntity> where T : new()
{
TEntity CreateEmpty<TEntity>();
}
答案 2 :(得分:2)
此方法将帮助您按顺序传递参数,在构造函数中使用参数:
private T CreateInstance<T>(params object[] parameters)
{
var type = typeof(T);
return (T)Activator.CreateInstance(type, parameters);
}