gpt4 book ai didi

c# - 如何使用 PropertyBuilder 创建私有(private)属性

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

在 C# 中,我们可以通过以下方式创建私有(private)属性:

private string Name { get; set; }

但是,假设我们正在使用 Reflection.Emit.PropertyBuilder 创建一个属性.

以下代码将创建一个public 属性(getter 和setter 方法尚未定义):

PropertyBuilder prop = typeBuilder.DefineProperty("Name", PropertyAttributes.None, CallingConvention.HasThis, typeof(string), Type.EmptyTypes);

我将如何定义同一属性但具有私有(private)可见性?

Reflection.Emit.FieldBuilder可以指定一个 FieldAttributes.Private,但是 PropertyBuilder 似乎没有提供类似的东西。

Reflection.Emit 这可能吗?

最佳答案

构建属性时,您可以设置私有(private)获取/设置属性,如下所示。您不能将属性本身设置为私有(private)。

来自 the documentation ,相关代码如下所示。

PropertyBuilder custNamePropBldr = myTypeBuilder.DefineProperty("CustomerName",
PropertyAttributes.HasDefault,
typeof(string),
null);

// The property set and property get methods require a special
// set of attributes.
MethodAttributes getSetAttr =
MethodAttributes.Public | MethodAttributes.SpecialName |
MethodAttributes.HideBySig;

// Define the "get" accessor method for CustomerName.
MethodBuilder custNameGetPropMthdBldr =
myTypeBuilder.DefineMethod("get_CustomerName",
getSetAttr,
typeof(string),
Type.EmptyTypes);

ILGenerator custNameGetIL = custNameGetPropMthdBldr.GetILGenerator();

custNameGetIL.Emit(OpCodes.Ldarg_0);
custNameGetIL.Emit(OpCodes.Ldfld, customerNameBldr);
custNameGetIL.Emit(OpCodes.Ret);

// Define the "set" accessor method for CustomerName.
MethodBuilder custNameSetPropMthdBldr =
myTypeBuilder.DefineMethod("set_CustomerName",
getSetAttr,
null,
new Type[] { typeof(string) });

ILGenerator custNameSetIL = custNameSetPropMthdBldr.GetILGenerator();

custNameSetIL.Emit(OpCodes.Ldarg_0);
custNameSetIL.Emit(OpCodes.Ldarg_1);
custNameSetIL.Emit(OpCodes.Stfld, customerNameBldr);
custNameSetIL.Emit(OpCodes.Ret);

// Last, we must map the two methods created above to our PropertyBuilder to
// their corresponding behaviors, "get" and "set" respectively.
custNamePropBldr.SetGetMethod(custNameGetPropMthdBldr);
custNamePropBldr.SetSetMethod(custNameSetPropMthdBldr);

关于c# - 如何使用 PropertyBuilder 创建私有(private)属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33674541/

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