2016-11-20 2 views
0

Ist es möglich, einem Feld oder einer Eigenschaft vor dem Konstruktor der Klasse einen Wert zuzuweisen und Reflektion zu verwenden?Feld oder Eigenschaftswert vor dem Konstruktor festlegen

Danke

+1

Fragen mit Ja oder Nein-Fragen sind in der Regel unproduktiv für die Person, die fragt, wer antwortet und die in Zukunft liest. Vielleicht deine Frage bearbeiten? –

+2

Warum würden Sie das tun? –

Antwort

2

Ja, es gibt einen hinterhältigen Weg, dies zu tun. Die geheime Soße ist FormatterServices.GetUninitializedObject, die eine Instanz zuweist, aber den Konstruktor nicht ausführen. Sie können Felder und Eigenschaften über Reflektion festlegen und dann den Konstruktor ausführen.

Ein kurzes Beispiel:

class Program 
{ 
    static void Main(string[] args) 
    { 
     object obj = FormatterServices.GetUninitializedObject(typeof(A)); 
     obj.GetType().GetProperty("I").SetValue(obj, 1); 
     obj.GetType().GetConstructor(Type.EmptyTypes).Invoke(obj, null); 
     Console.WriteLine("Done"); 
    } 
} 

class A 
{ 
    public A() 
    { 
     if (I != 0) 
     { 
      Console.WriteLine("Who set me? I = {0}", I); 
     } 
    } 

    public int I { get; set; } 
} 
+0

Sie waren der einzige, der meine Frage verstand. Vielen Dank, das ist genau das, was ich wollte. – Junior

2

Wenn Sie auf ein Feld oder eine Eigenschaft beziehen, die nicht statisch ist, die Antwort ist nein.

Sie haben keine Instanz der Klasse, bevor der Konstruktor aufgerufen wird. Sie hätten also keine Instanz, um das Feld oder die Eigenschaft zu aktivieren.

Wenn Sie jedoch nur einen Standardwert für eine Klasse angeben möchten. Sie können dies tun, indem Sie einfach Ihre Standardzuweisung nach dem Feld oder der Eigenschaftsdeklaration hinzufügen.

Wie so;

public class MyClass 
{ 
    public string MyString { get; set; } = "Default Value"; 

    public MyClass() 
    { 

    } 
} 

Nun, jede Instanz von MyClass eine Eigenschaft MyString mit einem Wert von „Standardwert“ hat, bis sie neu zugewiesen wurden.

+0

Danke, aber du hast meine Frage nicht verstanden. Sieh dir Mikes Antwort an, er verstand. – Junior

Verwandte Themen