gpt4 book ai didi

c# - 如何使用 C# 在运行时创建类的新实例?

转载 作者:太空宇宙 更新时间:2023-11-03 12:42:51 25 4
gpt4 key购买 nike

我有以下类,我在创建它的实例时传递了 Entity Framework 模型。

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是 Entity Framework 6 模型。

来 self 的 GetForeignRelation方法,我设置了 Client 的类型或 <TSource>这样我就可以创建 TableMapper 的新实例运行时类。

这是我试图在运行时创建它的新实例时尝试做的事情。

var RunTimeModel = Activator.CreateInstance(relationsMapping.ModelType);
var RunTimeMapper = new TableMapper<RunTimeModel>(relationsMapping.QueryExtractor, relationsMapping.TableAlias);

但这给了我一个错误。

The type or namespace name RunTimeModel could not be found (are you missing a using directive or an assembly reference?)

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

最佳答案

您将获得 TSource 的类名

typeof(TSource).Name

您应该能够创建一个实例:

var instance = Activator.CreateInstance(typeof(TSource));

只要类型在同一个程序集中其他属性可用于获取完整的命名空间

编辑:

此示例是否适用于您的 scanario?不得不删除你提供的代码,因为我不知道它背后的内容:)

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";
}
}

关于c# - 如何使用 C# 在运行时创建类的新实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38276229/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com