这是一个在运行时创建一个类的示例,该类包含一个Id
虚拟的整数属性:
class Program
{
static void Main(string[] args)
{
var aName = new AssemblyName("DynamicAssemblyExample");
var ab = AppDomain.CurrentDomain.DefineDynamicAssembly(aName, AssemblyBuilderAccess.Run);
var mb = ab.DefineDynamicModule(aName.Name);
var tb = mb.DefineType("MyDynamicType", TypeAttributes.Public);
var fbId = tb.DefineField("_id", typeof(int), FieldAttributes.Private);
var pbId = tb.DefineProperty("Id", PropertyAttributes.HasDefault, typeof(int), null);
var getSetAttr = MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig | MethodAttributes.Virtual;
var mbIdGetAccessor = tb.DefineMethod("get_Id", getSetAttr, typeof(int), Type.EmptyTypes);
var numberGetIL = mbIdGetAccessor.GetILGenerator();
numberGetIL.Emit(OpCodes.Ldarg_0);
numberGetIL.Emit(OpCodes.Ldfld, fbId);
numberGetIL.Emit(OpCodes.Ret);
var mbIdSetAccessor = tb.DefineMethod("set_Id", getSetAttr, null, new Type[] { typeof(int) });
var numberSetIL = mbIdSetAccessor.GetILGenerator();
numberSetIL.Emit(OpCodes.Ldarg_0);
numberSetIL.Emit(OpCodes.Ldarg_1);
numberSetIL.Emit(OpCodes.Stfld, fbId);
numberSetIL.Emit(OpCodes.Ret);
pbId.SetGetMethod(mbIdGetAccessor);
pbId.SetSetMethod(mbIdSetAccessor);
var t = tb.CreateType();
var instance = Activator.CreateInstance(t);
Console.WriteLine(t.GetProperty("Id").GetGetMethod().IsVirtual);
}
}
您在 中找不到任何相关内容的原因virtual
是PropertyBuilder
因为属性没有这个概念。方法可以是虚拟的,因此当您声明一个虚拟属性时,您就是在声明虚拟的 getter 和 setter 方法。看一下MethodAttributes枚举。