有没有一种方法可以确定以下setter可见性的差异:
public Prop { get; protected set; }
protected Prop { get; set; }
使用反射?还是在C#反射方面这些是等效的?
有没有一种方法可以确定以下setter可见性的差异:
public Prop { get; protected set; }
protected Prop { get; set; }
不,这两个setter是一样的。
验证这一点的明确方法是查看生成的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
之后。同样,如果它是private
,也是一样的。在这种情况下,两者都只是protected
,由family
表示。PropertyInfo.GetSetMethod(true)
。如果出现异常,则表示不存在私有/受保护的 setter。Func<PropertyInfo, int>
呢?这样会很有帮助,谢谢! - D.R.