区分属性受保护和设置器受保护。

3

有没有一种方法可以确定以下setter可见性的差异:

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

使用反射?还是在C#反射方面这些是等效的?

你为什么会期望它有所不同呢?设置器在任何方面上是否表现不同? - Cody Gray
我正在编写一个小型汇编检查工具,它应该能够准确地显示属性的可见性。 - D.R.
2
也许还应该检查 getter 并检查其保护级别。 - Hans Kesting
2个回答

3

不,这两个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表示。
我认为这符合预期:两个setter具有相同的可见性,因此它们应该对编译器和运行时环境看起来是相同的。

谢谢,我以为可能有一个由编译器生成的带有更多信息的属性,但显然并没有这样的东西。感谢您的努力,我会尽快接受! - D.R.

0
你可以使用 PropertyInfo.GetSetMethod(true)。如果出现异常,则表示不存在私有/受保护的 setter。

1
我不明白这个回答如何解决我的问题。你能否将其写成一个返回第一个属性为1,第二个属性为2的 Func<PropertyInfo, int> 呢?这样会很有帮助,谢谢! - D.R.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接