基于 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>();

Demo.