2009-09-09 12 views

Odpowiedz

9

Tak, to możliwe jest użycie refleksji aby ustawić wartość pola tylko do odczytu po konstruktora wyczerpał

var fi = this.GetType() 
      .BaseType 
      .GetField("_someField", BindingFlags.Instance | BindingFlags.NonPublic); 

fi.SetValue(this, 1); 

EDYCJA

Zaktualizowano, aby zobaczyć bezpośredni typ rodzica. To rozwiązanie prawdopodobnie będzie miało problemy, jeśli typy są ogólne.

+0

, ale z tym kodem nie mogę uzyskać pola nadrzędnego. w porządku? – Custodio

+0

@ Luís, zaktualizowałem kod tak, aby wyglądał w rodzimym typie – JaredPar

+0

u, dlaczego teraz mogę uzyskać moje pole za pomocą " k__BackingField"? – Custodio

1

Klasa ta pozwoli Ci zrobić:

http://csharptest.net/browse/src/Library/Reflection/PropertyType.cs

Zastosowanie:

new PropertyType(this.GetType(), "_myParentField").SetValue(this, newValue); 

BTW, będzie pracować na polach publicznych/niepublicznych lub właściwości. Dla ułatwienia można użyć klasy pochodzący PropertyValue tak:

new PropertyValue<int>(this, "_myParentField").Value = newValue; 
+0

+1 dla biblioteki csharptest-net. Ma interesujący rejestrator. –

1

Tak, możesz.

Dla pól użyj klasy FieldInfo. Parametr BindingFlags.NonPublic pozwala zobaczyć prywatne pola.

public class Base 
{ 
    private string _id = "hi"; 

    public string Id { get { return _id; } } 
} 

public class Derived : Base 
{ 
    public void changeParentVariable() 
    { 
     FieldInfo fld = typeof(Base).GetField("_id", BindingFlags.Instance | BindingFlags.NonPublic); 
     fld.SetValue(this, "sup"); 
    } 
} 

i mały test, aby udowodnić, że działa:

public static void Run() 
{ 
    var derived = new Derived(); 
    Console.WriteLine(derived.Id); // prints "hi" 
    derived.changeParentVariable(); 
    Console.WriteLine(derived.Id); // prints "sup" 
} 
0

Jak JaredPar wskazuje, zrobiłem następująco:

//to discover the object type 
Type groupType = _group.GetType(); 
//to discover the parent object type 
Type bType = groupType.BaseType; 
//now I get all field to make sure that I can retrieve the field. 
FieldInfo[] idFromBaseType = bType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance); 

//And finally I set the values. (for me, the ID is the first element) 
idFromBaseType[0].SetValue(_group, 1); 

Dzięki wszystkim.

+0

Czy jesteś pewien, że idFromBaseType [0] jest poprawnym polem? Prawdopodobnie powinieneś pasować według nazwy ... –

+0

U mnie działa, bo moim pierwszym elementem jest identyfikator. Ale próbowałem dostać pole ze sznurkiem, ale bez powodzenia. – Custodio

Powiązane problemy