2015-12-30 19 views
5

Próbuję utworzyć funkcję, która może zwrócić pole z jego obiektu.Pobierz pole według nazwy

Oto, co mam do tej pory.

public class Base 
{ 
    public string thing = "Thing"; 
    public T GetAttribute<T>(string _name) 
    { 
     return (T)typeof(T).GetProperty(_name).GetValue(this, null); 
    } 
} 

Co bym najlepiej jak to nazwać:

string thingy = GetAttribute<string>("thing"); 

ale mam wrażenie, mam zły koniec kija podczas czytania na to, bo wciąż otrzymuję zerowe wyjątki referencyjnych.

+0

użyć następującej odpowiedzi from [here] (http://stackoverflow.com/questions/1196991/get-property-value- from-string-using-reflection-in-c-sharp) –

+1

Należy zauważyć, że w języku C# termin "atrybut" ma konkretne znaczenie: jest to część metadanych, które można dołączyć do klas lub metod, między innymi. Na tym nie polega twoje pytanie - prawidłowe warunki będą takie, że używasz "refleksji", aby uzyskać wartość "pola" lub "własności". –

Odpowiedz

3

Pierwsza rzecz - thing to pole, a nie właściwość.

Inną rzeczą jest to, że dałeś, aby zmienić typ parametru, aby to działa:

public class Base { 

    public string thing = "Thing"; 

    public T GetAttribute<T> (string _name) { 
     return (T)typeof(Base).GetField(_name).GetValue (this, null); 
    } 
} 

BTW - można uzyskać wartość nieruchomość/pole poprzez odniesienie instancję:

var instance = new Base(); 
var value = instance.thing; 
+0

dziękuję bardzo, że działa urok! Mam tylko jeden problem, który jest moją winą, o której wcześniej nie wspomniałem, baza będzie dziedziczona przez inne rzeczy, czy istnieje sposób na powiedzenie czegoś w rodzaju "typeof (this)"? – inadequateMonkey

+0

dzięki za BTW też, wiem, że to wydaje się bardzo nielogiczne, ale jest bardzo długi i skomplikowany powód, dla którego tego potrzebuję, nie będę do niego wracał :) – inadequateMonkey

+1

@inadequateMonkey użyj 'this.GetType()' zamiast 'typeof (Base) ' –

5

thing to pole nie będące własnością. Powinieneś użyć metody GetField zamiast GetProperty. Kolejny problem to: typeof(T). Powinieneś poszukać pola w typeof(Base).

Cała funkcja powinna zostać zmieniona na

public T GetAttribute<T>(string _name) 
{ 
    return (T)GetType().GetField(_name).GetValue(this); 
} 

Jeśli chcesz mieć metodę rozszerzenia, aby uzyskać wartość pola typu można użyć tej

public static class Ex 
{ 
    public static TFieldType GetFieldValue<TFieldType, TObjectType>(this TObjectType obj, string fieldName) 
    { 
     var fieldInfo = obj.GetType().GetField(fieldName, 
      BindingFlags.Instance | BindingFlags.Static | 
      BindingFlags.Public | BindingFlags.NonPublic); 
     return (TFieldType)fieldInfo.GetValue(obj); 
    } 
} 

Używaj go jak

var b = new Base(); 
Console.WriteLine(b.GetFieldValue<string, Base>("thing")); 

Za pomocą BindingFlags pomoże Ci uzyskać wartość pola, nawet jeśli jest to priva te lub pole statyczne.

+0

Czy możesz wyjaśnić powód upadku, aby poprawić moją odpowiedź? – dotctor

+0

Rozwiązuje to tylko część problemu - wyraźnie występują problemy z typem parametru. – Kamo

+0

dzięki, zmieniłem go na: return (T) typeof (T) .GetField (_name) .GetValue (this); ale nadal nie ma radości – inadequateMonkey