区分属性受到保护,setter受到保护

时间:2016-11-26 17:00:38

标签: c# .net reflection

有没有办法确定 setter 的可见性差异:

public Prop { get; protected set; }
protected Prop { get; set; }

使用反射?或者那些与C#Reflection相同的是什么?

2 个答案:

答案 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。