实体框架 - 如何使用 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 指令或程序集引用?

如何在运行时正确创建同一类的新实例?

实体框架 - 如何使用 c# 在运行时创建类的新实例

你会得到 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 });

但是,运行时映射器的返回值类型是对象。我不知道如何将运行时映射器转换为其实际类型。所以,使用起来有点不方便。

引用:如何:使用反射检查和实例化泛型类型