Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 区分属性受保护和setter受保护_C#_.net_Reflection - Fatal编程技术网

C# 区分属性受保护和setter受保护

C# 区分属性受保护和setter受保护,c#,.net,reflection,C#,.net,Reflection,是否有一种方法可以确定以下各项的设置器可见性差异: public Prop { get; protected set; } protected Prop { get; set; } 使用反射?或者这些在C#反射方面是等价的?您可以使用PropertyInfo.GetSetMethod(true)。如果出现异常,则表示不存在私有/受保护的setter 不,这两个设定器是相同的 验证这一点的最终方法是查看为这两个变体生成的IL。我用以下两个属性编译了一个小测试: public int P

是否有一种方法可以确定以下各项的设置器可见性差异:

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

使用反射?或者这些在C#反射方面是等价的?

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

不,这两个设定器是相同的

验证这一点的最终方法是查看为这两个变体生成的IL。我用以下两个属性编译了一个小测试:

  public    int Prop  { get; protected set; }
  protected int Prop2 { get; set; }
然后我把它拆开。两个属性的设置器的IL相同,只是名称不同(
Prop
vs
Prop2
):

.methodfamily隐藏特殊名称实例void
set_Prop(int32'值)cil管理
{
.custom instance void[mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor()=(01 00)
//代码大小8(0x8)
.maxstack 8
IL_0000:ldarg.0
IL_0001:ldarg.1
IL_0002:stfld int32控制台应用程序1.程序::'k_BackingField'
IL_0007:ret
}//方法结束程序::set_Prop
.methodfamily隐藏特殊名称实例void
set_Prop2(int32'值)cil管理
{
.custom instance void[mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor()=(01 00)
//代码大小8(0x8)
.maxstack 8
IL_0000:ldarg.0
IL_0001:ldarg.1
IL_0002:stfld int32控制台应用程序1.程序::'k_BackingField'
IL_0007:ret
}//方法结束程序::set_Prop2
如果该方法是公共的,它将在顶部用
public
注释,在
.method
之后的列表中。同样,如果它是
私有的
。在这种情况下,两者都是简单的
保护的
,由
系列
表示


我想说,这与预期一致:两个setter都具有相同的可视性,因此它们在编译器和运行时环境中应该是相同的。

为什么您希望它有所不同?setter的行为有什么不同吗?我正在编写一个小的程序集检查工具,它应该准确地显示属性的可见性。也许还可以检查getter并检查它的保护级别。我不知道这是如何回答我的问题的。您是否可以将其写为
Func
,第一个属性返回
1
,第二个属性返回
2
?会有帮助的,谢谢!谢谢,我想可能有一个编译器生成的属性包含更多信息,但显然没有这样的东西。感谢您的努力,尽快接受!
.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