2012-12-07 12 views
14

जिस समस्या को मैं हल करने का प्रयास कर रहा हूं वह है कि एक विधि को एक स्ट्रिंग के रूप में एक संपत्ति नाम में कैसे लेना है, और कहा गया संपत्ति को आवंटित मान देता है।सी # संपत्ति के नाम से गतिशील रूप से संपत्ति मूल्यों तक पहुंच

मेरे मॉडल वर्ग के समान घोषित किया जाता है:

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

और मेरे विधि के भीतर से मैं इस तरह के भाव का उपयोग करके इस

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

मैं वर्तमान में यह करने के लिए कोशिश कर रहा हूँ करने के लिए कुछ इसी तरह करना चाहते हैं

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

    } 

क्या यह दृष्टिकोण सही है, और यदि हां, तो क्या यह वापस लौटना संभव है एक गतिशील प्रकार के रूप में है?

उत्तर सही थे, यह अब तक बहुत जटिल बना रहा था। समाधान अब है:

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

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

आप किसी विशेष प्रकार से किसी संपत्ति के मूल्य को देखने के लिए System.Reflection.PropertyInfo का उपयोग कर सकते हैं। http://msdn.microsoft.com/en-us/library/system.reflection.propertyinfo.aspx – Chris

उत्तर

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

मुझे लगता है कि यह उन गुणों के लिए अपवाद फेंक देगा जिनमें इंडेक्सर है। –

6

आप नमूने उपलब्ध कराने के साथ जिस तरह से पानी में गिर जा रहे हैं।

विधि आप देख रहे हैं:

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

लेकिन "वर" और "गतिशील" और "अभिव्यक्ति" और "लैम्ब्डा" का उपयोग कर ... आप इस कोड को 6 में खो करने के लिए बाध्य कर रहे हैं अब से महीने इसे लिखने के सरल तरीकों पर चिपकाएं