2012-12-07 14 views
14

Das Problem, das ich zu lösen versuche, ist, wie eine Methode geschrieben wird, die einen Eigenschaftsnamen als eine Zeichenfolge annimmt und den dieser Eigenschaft zugewiesenen Wert zurückgibt.C# Zugriff auf Eigenschaftswerte dynamisch nach Eigenschaftsname

ist meine Modellklasse ähnlich wie erklärt:

public class Foo 
{ 
    public int FooId 
    public int param1 
    public double param2 
} 

und aus meiner Methode möchte ich etwas ähnlich wie diese

var property = GetProperty("param1) 
var property2 = GetProperty("param2") 

ich zur Zeit, dies zu tun versucht bin tun, indem Sie Ausdrücke wie beispiels wie

public dynamic GetProperty(string _propertyName) 
    { 
     var currentVariables = m_context.Foo.OrderByDescending(x => x.FooId).FirstOrDefault(); 

     var parameter = Expression.Parameter(typeof(Foo), "Foo"); 
     var property = Expression.Property(parameter, _propertyName); 

     var lambda = Expression.Lambda<Func<GlobalVariableSet, bool>>(parameter); 

    } 

Ist dieser Ansatz korrekt, und wenn ja, ist es möglich, th zurückzukehren ist als dynamischer Typ?

Die Antworten waren korrekt, machte dies viel zu komplex. Die Lösung ist jetzt:

public dynamic GetProperty(string _propertyName) 
{ 
    var currentVariables = m_context.Foo.OrderByDescending(g => g.FooId).FirstOrDefault(); 

    return currentVariables.GetType().GetProperty(_propertyName).GetValue(currentVariables, null); 
} 
+0

Sie können jst mit System.Reflection.PropertyInfo den Wert einer Eigenschaft eines bestimmten Typs ermitteln. http://msdn.microsoft.com/en-us/library/system.reflection.propertyinfo.aspx – Chris

Antwort

26
public static object ReflectPropertyValue(object source, string property) 
{ 
    return source.GetType().GetProperty(property).GetValue(source, null); 
} 
+0

Ich denke, das wird eine Ausnahme für Eigenschaften, die einen Indexer haben, werfen. –

6

Sie gehen Weg über Bord mit den Proben, die Sie zur Verfügung stellen.

Verfahren Sie suchen:

public static object GetPropValue(object target, string propName) 
{ 
    return target.GetType().GetProperty(propName).GetValue(target, null); 
} 

Aber „var“ und „dynamisch“ und „Expression“ und „Lambda“ mit ... Sie sind verpflichtet, 6 in diesem Code verloren gehen Monate von jetzt an. Bleiben Sie bei einfacheren Schreibweisen.

Verwandte Themen