C# 动态方法创建
所以,我整个上午都在努力研究这个问题,但运气不好。我试图找到一种动态创建方法/委托/lambda的方法,该方法返回从某个基类继承的某个类(直到运行时才知道)的新实例 我可以保证以下关于未知/动态类的信息C# 动态方法创建,c#,reflection,dynamic,C#,Reflection,Dynamic,所以,我整个上午都在努力研究这个问题,但运气不好。我试图找到一种动态创建方法/委托/lambda的方法,该方法返回从某个基类继承的某个类(直到运行时才知道)的新实例 我可以保证以下关于未知/动态类的信息 它将始终从一个已知类(行)继承 它将至少有2个构造函数(一个接受long,一个接受IDataRecord) 我计划做以下工作: 查找具有特定属性的所有类 创建委托/方法/lambda/创建类的新实例的任何对象 在结构/类中存储委托/任何内容以及某些属性 将结构插入哈希表 需要时,从哈希表中提取信
如果您需要更多信息,请告诉我!先谢谢你!:) 那么
Activator.CreateInstance
呢
样本:
string typeName = ...;
Activator.CreateInstance(Type.GetType(typeName), params);
您可以使用LINQ表达式在运行时构造lambda
(长p)=>新的XXX(p)作为行
:
Type type = // ...
ConstructorInfo ctor = type.GetConstructor(new Type[] { typeof(long) });
var p = Expression.Parameter(typeof(long), "p");
var expr = Expression.Lambda<Func<long, Row>>(
Expression.TypeAs(
Expression.New(ctor, p),
typeof(Row)),
p);
Func<long, Row> rowCreator = expr.Compile();
Row row = rowCreator(10);
Type=/。。。
ConstructorInfo-ctor=type.GetConstructor(新类型[]{typeof(long)});
var p=表达式参数(typeof(long),“p”);
var expr=Expression.Lambda(
表达式.TypeAs(
新表达式(ctor,p),
类型(行)),
p) );
Func rowCreator=expr.Compile();
行=行创建者(10);
我相信CreateInstance有一个重载,可以让您指定构造函数参数。这将是你的最佳选择。这将很好,除非他必须每秒执行数千次,在这种情况下,编译委托会更好。我正在寻找编译委托:-\n这将在网站上运行,如果可能的话,我希望在加载时发生一次反射导致的性能下降。值得注意的是,对于紧凑型框架,您不能使用这种方法。然后你需要深入思考,做同样的事情。。至少用params调用一个ctor。从未真正看到表达式的良好用途,但你让我大开眼界:)我喜欢这个样式,但它是否编译为真正的IL,性能是否与new long()一样好@Andrey:expr.Compile()
将表达式编译为实际IL。性能与lambda表达式在编译时编译时的性能相同,因此它可以得到:-),尽管type.GetConstructor不应该被多次调用,否则它将破坏性能。@Andrey:expr.compile()返回的编译后的lambda可以缓存并在以后多次重用。无需多次构造表达式。