如何动态实例化对象
本文关键字:实例化 对象 动态 何动态 | 更新日期: 2023-09-27 18:36:43
我正在尝试构建一个工厂类,它将为我提供不同 DbContext 的单例化实例。
主要思想是有一个Dictionary<Type,DbContext>
来保存我需要的所有实例,以及一个GetDbContext(Type type)
方法,该方法在字典中查找类型并在它已经存在时返回它。如果没有,它应该创建一个新的Type(),并将其添加到相应的字典中。
我不知道该怎么做contexts.Add(type, new type());
public class DbContextFactory
{
private readonly Dictionary<Type, DbContext> _contexts;
private static DbContextFactory _instance;
private DbContextFactory()
{
_contexts= new Dictionary<Type, DbContext>();
}
public static DbContextFactory GetFactory()
{
return _instance ?? (_instance = new DbContextFactory());
}
public DbContext GetDbContext(Type type)
{
if (type.BaseType != typeof(DbContext))
throw new ArgumentException("Type is not a DbContext type");
if (!_contexts.ContainsKey(type))
_contexts.Add(type, new type()); //<--THIS is what I have now Idea how to do
return _contexts[type];
}
}
使其成为泛型方法:
public DbContext GetDbContext<T>() where T : new()
{
if (typeof(T).BaseType != typeof(DbContext))
throw new ArgumentException("Type is not a DbContext type");
if (!_contexts.ContainsKey(type))
_contexts.Add(typeof(T), new T());
return _contexts[type];
}
可以使用激活器创建 C# 类。 一种方法是 .创建实例(类型)。
MyClassBase myClass = Activator.CreateInstance(typeof(MyClass)) as MyClass;
但是,对于 DbContext,您很可能希望传入连接字符串,因此请使用 .CreateInstance(Type type, params Object[] args)
DbContext myContext = Activator.CreateInstance(typeof(MyClass),
"ConnectionString") as DbContext;
或作为泛型方法:
if (!_contexts.ContainsKey(typeof(T)))
_contexts.Add(typeof(T),
(T)Activator.CreateInstance(typeof(T), "ConnectionString");