基于 C# 中的泛型类型创建新实例
Creating new instance based on the Generic Type in c#
我正在使用工厂模式,其中,基于它将创建的接口和 return 新的 concreate object.I 我正在使用通用类型并使用 switch 检查不同的 concreate 对象。这是我的 class 布局。
public class Factory<T>
{
public T Instance()
{
switch(T)
{
case IUser:
return new Domain.User();
break;
case IProduct:
return new Domain.Product();
break;
}
}
}
但是这给我一个错误:
'T' is a type, which is not valid in the given context
和
Cannot implicitly convert type 'Domain.User' to 'T'
这就是我的客户端代码调用上述工厂的方式 class。
private readonly Factory<IUser> factory = new Factory<IUser>();
IUser oUser = factory.Instance();
您不能在 switch
中使用类型,但您可以打开类型名称:
switch(typeof(T).Name) {
case nameof(IUser):
return new Domain.User();
break;
case nameof(IProduct):
return new Domain.Product();
break;
}
请注意,这是一个非常不灵活的解决方案,因为向工厂添加新类型需要重新编译包含 switch
.
的罚款
更好的方法是创建工厂接受的类型注册表,或者使用现有的解决方案,例如 autofac。
这是一个带有注册的工厂的框架实现:
class Factory {
private readonly IDictionary<Type,Func<object>> registry = new Dictionary<Type,Func<object>>();
public void Register<T>(Func<T> make) {
registry.Add(typeof(T), () => (object)make());
}
public T Instance<T>() {
return (T)registry[typeof(T)]();
}
}
您将按如下方式使用工厂:
Factory f = new Factory();
f.Register<IUser>(() => new User());
f.Register<IProduct>(() => new Product());
IUser u = f.Instance<IUser>();
我正在使用工厂模式,其中,基于它将创建的接口和 return 新的 concreate object.I 我正在使用通用类型并使用 switch 检查不同的 concreate 对象。这是我的 class 布局。
public class Factory<T>
{
public T Instance()
{
switch(T)
{
case IUser:
return new Domain.User();
break;
case IProduct:
return new Domain.Product();
break;
}
}
}
但是这给我一个错误:
'T' is a type, which is not valid in the given context
和
Cannot implicitly convert type 'Domain.User' to 'T'
这就是我的客户端代码调用上述工厂的方式 class。
private readonly Factory<IUser> factory = new Factory<IUser>();
IUser oUser = factory.Instance();
您不能在 switch
中使用类型,但您可以打开类型名称:
switch(typeof(T).Name) {
case nameof(IUser):
return new Domain.User();
break;
case nameof(IProduct):
return new Domain.Product();
break;
}
请注意,这是一个非常不灵活的解决方案,因为向工厂添加新类型需要重新编译包含 switch
.
更好的方法是创建工厂接受的类型注册表,或者使用现有的解决方案,例如 autofac。
这是一个带有注册的工厂的框架实现:
class Factory {
private readonly IDictionary<Type,Func<object>> registry = new Dictionary<Type,Func<object>>();
public void Register<T>(Func<T> make) {
registry.Add(typeof(T), () => (object)make());
}
public T Instance<T>() {
return (T)registry[typeof(T)]();
}
}
您将按如下方式使用工厂:
Factory f = new Factory();
f.Register<IUser>(() => new User());
f.Register<IProduct>(() => new Product());
IUser u = f.Instance<IUser>();