2016-11-26 5 views
3
geschützt

Gibt es eine Möglichkeit, die Setter Sichtbarkeit Differenz zu bestimmen:zwischen Eigentum geschützt ist und Setter ist

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

mit Reflexion? Oder sind diese in Bezug auf C# Reflection gleichwertig?

+0

Warum sollten Sie erwarten, dass es anders ist? Verhält sich der Setter * in irgendeiner Weise anders? –

+0

Ich schreibe ein kleines Assembly Inspection Tool, das die Sichtbarkeit von Eigenschaften genau anzeigen soll. –

+2

Vielleicht prüfen Sie auch den * Getter * und überprüfen * es ist * Schutzstufe. –

Antwort

3

Nein, die beiden Setter sind identisch.

Die beste Möglichkeit, dies zu überprüfen, ist die IL, die für die beiden Varianten generiert wurde. Ich kompilierte einen kleinen Test mit den folgenden zwei Eigenschaften:

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

Und dann zerlegte ich es. Die IL ist identisch für die Einrichter für beide Eigenschaften, für den Unterschied in ihren Namen speichern (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 

Wenn die Methode der Öffentlichkeit, wäre es mit public an die annotiert werden oben, in der Liste method attributes, die nach .method kommen. Ähnlich, wenn es private wäre. In diesem Fall sind beide einfach protected, was mit family bezeichnet ist.

Ich würde sagen, dass dies mit den Erwartungen übereinstimmt: beide Setter haben identische Sichtbarkeiten, so dass sie mit dem Compiler und Laufzeitumgebung identisch erscheinen sollten.

+0

Danke, dachte da vielleicht ein Compiler-generierte Attribut mit mehr Informationen, aber anscheinend gibt es so etwas nicht. Vielen Dank für Ihre Bemühungen, so schnell wie möglich zu akzeptieren! –

0

Sie können PropertyInfo.GetSetMethod(true) verwenden. Wenn Sie eine Ausnahme erhalten, bedeutet dies, dass ein privater/geschützter Setter nicht existiert.

+1

Ich sehe nicht, wie das meine Frage beantwortet. Könnten Sie es vielleicht als 'Func ' aufschreiben, die '1' für die erste Eigenschaft und' 2' für die zweite Eigenschaft zurückgibt? Wäre hilfreich, danke! –

Verwandte Themen