实体框架 - 如何使用 c# 在运行时创建类的新实例
本文关键字:新实例 实例 创建 运行时 框架 何使用 实体 | 更新日期: 2023-09-27 17:56:15
我有以下类,我在创建实体框架模型实例时传递了它。
public class TableMapper<TSource>
{
protected IQueryExtractor QueryExtractor { get; set; }
protected string TableAliasPrefix { get; private set; }
public TableMapper(IQueryExtractor queryExtractor, string tableAliasPrefix = null)
{
QueryExtractor = queryExtractor;
TableAliasPrefix = tableAliasPrefix;
}
public IReportRelation GetForeignRelation<TProperty>(Expression<Func<TSource, TProperty>> property)
{
return new ReportRelation
{
Column = GetReportColumn(null, Self, property),
TableName = this.Table(),
TableAlias = this.GetSqlAlias(),
ModelType = typeof(TSource),
QueryExtractor = this.QueryExtractor
};
}
...
...
...
}
我称这个为上面的类,但来自另一个类,就像这样
var clientMapper = new TableMapper<Client>(QueryExtractor, "Client");
var = clientMapper.GetForeignRelation(x => x.Id);
请注意,Client
是实体框架 6 模型。
在 GetForeignRelation
方法中,我设置了Client
或<TSource>
的类型,以便我可以在运行时创建 TableMapper
类的新实例。
这是我尝试在运行时创建它的新实例时尝试做的事情。
var RunTimeModel = Activator.CreateInstance(relationsMapping.ModelType);
var RunTimeMapper = new TableMapper<RunTimeModel>(relationsMapping.QueryExtractor, relationsMapping.TableAlias);
但这给了我一个错误。
找不到类型或命名空间名称
RunTimeModel
(您是 缺少 using 指令或程序集引用?
如何在运行时正确创建同一类的新实例?
你会得到 Suchrce 的类名
typeof(TSource).Name
您应该能够使用以下内容创建实例:
var instance = Activator.CreateInstance(typeof(TSource));
只要类型位于同一程序集中其他属性可用于获取完整的命名空间
编辑:
这个例子适用于你的斯堪纳里奥吗?不得不剥离您提供的代码,因为我不知道这一切背后的原因:)
class Program
{
static void Main(string[] args)
{
var test = new TableMapper<A>();
var fr = test.GetForeignRelation();
var type = fr.ModelType;
var newInstance = Activator.CreateInstance(type);
}
}
public class TableMapper<TSource>
{
public TableMapper()
{
}
public ReportRelation GetForeignRelation()
{
return new ReportRelation
{
ModelType = typeof(TSource)
};
}
}
public class ReportRelation
{
public Type ModelType { get; set; }
}
public class A
{
public string Test { get; set; }
public A()
{
Test = "Some string";
}
}
不能将变量传递给类型参数
var RunTimeModel = Activator.CreateInstance(relationsMapping.ModelType);
var RunTimeMapper = new TableMapper<RunTimeModel>(relationsMapping.QueryExtractor, relationsMapping.TableAlias)
因为 RunTimeModel 不是一个类型,而是一个变量。我认为您缺少正在使用的方法的目的。
可以使用以下代码实例化泛型类型:
var RunTimeMapper = Activator.CreateInstance(typeof(TableMapper<>).MakeGenericType(new[] { relationsMapping.ModelType }), new[] { relationsMapping.QueryExtractor, relationsMapping.TableAlias });
但是,运行时映射器的返回值类型是对象。我不知道如何将运行时映射器转换为其实际类型。所以,使用起来有点不方便。
引用:如何:使用反射检查和实例化泛型类型