gpt4 book ai didi

c# - 我可以使用 System.Reflection.Emit 为现有类型构建构造函数吗?

转载 作者:行者123 更新时间:2023-11-30 18:19:44 26 4
gpt4 key购买 nike

c# 是否支持使用 DynamicMethod 构建构造函数? ?考虑这个类:

public class Foo
{
public string Bar { get; set; }

public Foo(string bar)
{
Bar = bar;
}
}

我想为 Foo 创建一个新的构造函数不接受任何参数,并将其编译为 Func<Foo> .例如:

DynamicMethod dyn = new DynamicMethod("NewInitializer", typeof(Foo), Type.EmptyTypes);
ILGenerator il = dyn.GetILGenerator();

LocalBuilder loc0 = il.DeclareLocal(typeof(Foo));
il.Emit(OpCodes.Ldloca_S, loc0);
il.Emit(OpCodes.Call, typeof(object).GetConstructor(Type.EmptyTypes));
il.Emit(OpCodes.Ldloc_0);
il.Emit(OpCodes.Ret);

Func<Foo> newInitFunc = (Func<Foo>)dyn.CreateDelegate(typeof(Func<Foo>));
Foo f = newInitFunc();

请注意,这只是我尝试过的实现之一。一切最终都会抛出 AccessViolationException :

Operation Could Destabilize the Runtime

当我调用该方法时。甚至可以使用 DynamicMethod 创建构造函数吗? ?

最佳答案

如果可以从这些类型继承,您可以使用 Emit 创建一个类,该类从现有类型继承并且不调用基本构造函数。

var typeToLoad = typeof(Foo);
var assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(new AssemblyName("Dynamic"), AssemblyBuilderAccess.Run);
var moduleBuilder = assemblyBuilder.DefineDynamicModule("Dynamic");
var typeBuilder = moduleBuilder.DefineType(typeToLoad.Name, TypeAttributes.Public | TypeAttributes.Class | TypeAttributes.AnsiClass | TypeAttributes.AutoClass, typeToLoad);
// create a constructor that doesn't call the base constructor
var constructorBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.RTSpecialName | MethodAttributes.SpecialName, CallingConventions.Standard, Type.EmptyTypes);
var ilGenerator = constructorBuilder.GetILGenerator();
ilGenerator.Emit(OpCodes.Ret);
// create a factory method so we could create a delegate for it
var methodBuilder = typeBuilder.DefineMethod("Create", MethodAttributes.Public | MethodAttributes.Static | MethodAttributes.HideBySig, typeBuilder, Type.EmptyTypes);
ilGenerator = methodBuilder.GetILGenerator();
ilGenerator.Emit(OpCodes.Newobj, constructorBuilder);
ilGenerator.Emit(OpCodes.Ret);
var generatedType = typeBuilder.CreateType();
var factory = (Func<Foo>)generatedType.GetMethod("Create", BindingFlags.Public | BindingFlags.Static).CreateDelegate(typeof(Func<Foo>));

这与 new 操作符一样快。

关于c# - 我可以使用 System.Reflection.Emit 为现有类型构建构造函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38319828/

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