jav*_*iry 3 c# lambda il delegates expression
我知道Activator.CreateInstance()可以创建一个新的实例object。IL但我正在寻找一种通过和创建实例的方法Expression。我想我可以创建一个动态 lambda 来创建类型的实例,并缓存 lambda 以加速对象初始化。我对吗?你能帮我吗?
您可以使用 来表示对象的创建Expression.New()。您可以将Type具有无参数构造函数的 a 或 aConstructorInfo以及Expression表示构造函数参数的 s 传递给它。如果您想返回 anobject并且希望它也适用于值类型,则还需要添加Expression.Convert().
将它们放在一起,相当于Activator.CreateInstance()如下所示:
object CreateInstance(Type type)
{
return Expression.Lambda<Func<object>>(
Expression.Convert(Expression.New(type), typeof(object)))
.Compile()();
}
Run Code Online (Sandbox Code Playgroud)
如果你想在IL中做同样的事情,你需要使用引用类型的指令。newobj如果您想对值类型执行相同的操作,您可以创建该类型的局部变量,将其装箱并返回:
object CreateInstance(Type type)
{
var method = new DynamicMethod("", typeof(object), Type.EmptyTypes);
var il = method.GetILGenerator();
if (type.IsValueType)
{
var local = il.DeclareLocal(type);
// method.InitLocals == true, so we don't have to use initobj here
il.Emit(OpCodes.Ldloc, local);
il.Emit(OpCodes.Box, type);
il.Emit(OpCodes.Ret);
}
else
{
var ctor = type.GetConstructor(Type.EmptyTypes);
il.Emit(OpCodes.Newobj, ctor);
il.Emit(OpCodes.Ret);
}
return method.Invoke(null, null);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2477 次 |
| 最近记录: |