2015-12-30 14 views
5

Ich versuche, eine Funktion zu erstellen, die ein Feld von seinem Objekt zurückgeben kann.Feld nach Name erhalten

Hier ist was ich bisher habe.

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

Was würde ich am liebsten ist zu nennen:

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

aber ich habe das Gefühl, ich das falsche Ende des Stockes bekam, wenn sie auf diese zu lesen, weil ich immer null Referenz Ausnahmen zu bekommen.

+0

folgende Antwort Verwenden von [hier] (http://stackoverflow.com/questions/1196991/get-property-value-from-string-using-reflection-in-c-sharp) –

+1

Beachten Sie, dass in C# der Begriff "Attribut" eine hat spezifische Bedeutung: Es ist ein Stück Metadaten, die unter anderem an Klassen oder Methoden angehängt werden können. Das ist nicht das, worum es in Ihrer Frage geht - die richtigen Begriffe wären, dass Sie "Reflexion" verwenden, um den Wert eines "Feldes" oder einer "Eigenschaft" zu erhalten. –

Antwort

3

Erste Sache - thing ist ein Feld, keine Eigenschaft.

Eine andere Sache ist, dass Sie gab Parametertyp zu ändern, um es arbeiten:

public class Base { 

    public string thing = "Thing"; 

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

BTW - Sie Eigenschaft/Feldwert durch Bezugnahme auf eine Instanz bekommen:

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

vielen dank, das wirkt charmant! Ich habe nur ein Problem, was meine Schuld ist, weil ich es vorher nicht erwähnt habe. Base wird von anderen Dingen geerbt. Gibt es eine Möglichkeit, eine Art "typof (this)" -Ding zu sagen? – inadequateMonkey

+0

danke für die BTW auch, ich weiß, das scheint sehr unlogisch, aber es gibt einen sehr langen und komplizierten Grund dafür, ich werde nicht gehen :) – inadequateMonkey

+1

@inadequateMonkey verwenden 'this.GetType()' anstelle von 'typeof (Base) ' –

5

thing ist ein Feld keine Eigenschaft. Sie sollten GetField Methode anstelle von GetProperty verwenden. Ein anderes Problem suchen Sie in typeof(T). Sie sollten nach dem Feld in typeof(Base) suchen.

Die ganze Funktion sollte

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

geändert werden, wenn Sie eine Erweiterungsmethode haben wollen Feldwert eines Typs erhalten Sie diese es

wie

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); 
    } 
} 

Verwenden verwenden können

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

Die Verwendung von BindingFlags hilft Ihnen, Feldwert zu erhalten, auch wenn es priva ist te oder statisches Feld.

+0

Können Sie den Grund für den Downvote erklären, damit ich meine Antwort verbessern kann? – dotctor

+0

Dies löst nur einen Teil eines Problems - es gibt eindeutig Probleme mit dem Parametertyp. – Kamo

+0

Danke, ich habe es geändert in: return (T) typeof (T) .GetField (_name) .GetValue (this); aber immer noch keine Freude – inadequateMonkey