有没有办法确定 setter 的可见性差异:
public Prop { get; protected set; }
protected Prop { get; set; }
使用反射?或者那些与C#Reflection相同的是什么?
答案 0 :(得分:3)
不,这两位二人是完全相同的。
验证这一点的最终方法是查看为这两种变体生成的IL。我用以下两个属性编译了一个小测试:
public int Prop { get; protected set; }
protected int Prop2 { get; set; }
然后我把它拆开了。对于两个属性的setter,IL都是相同的,除了名称的差异(Prop
vs Prop2
):
.method family hidebysig specialname instance void
set_Prop(int32 'value') cil managed
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
// Code size 8 (0x8)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldarg.1
IL_0002: stfld int32 ConsoleApplication1.Program::'<Prop>k__BackingField'
IL_0007: ret
} // end of method Program::set_Prop
.method family hidebysig specialname instance void
set_Prop2(int32 'value') cil managed
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
// Code size 8 (0x8)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldarg.1
IL_0002: stfld int32 ConsoleApplication1.Program::'<Prop2>k__BackingField'
IL_0007: ret
} // end of method Program::set_Prop2
如果该方法是公开的,则会在public
之后的method attributes列表的顶部.method
进行注释。同样,如果它是private
。在这种情况下,两者都只是protected
,由family
表示。
我认为这与预期一致:两个setter都具有相同的可见性,因此它们应该与编译器和运行时环境相同。
答案 1 :(得分:0)
您可以使用PropertyInfo.GetSetMethod(true)
。如果您收到异常,则表示不存在私有/受保护的setter。