नाम के आधार पर संपत्ति का मूल्य कैसे प्राप्त करें


147

क्या उसके नाम के आधार पर किसी वस्तु की संपत्ति का मूल्य प्राप्त करने का एक तरीका है?

उदाहरण के लिए अगर मेरे पास:

public class Car : Vehicle
{
   public string Make { get; set; }
}

तथा

var car = new Car { Make="Ford" };

मैं एक विधि लिखना चाहता हूं जहां मैं संपत्ति के नाम से गुजर सकता हूं और यह संपत्ति के मूल्य को वापस कर देगा। अर्थात:

public string GetPropertyValue(string propertyName)
{
   return the value of the property;
}

जवाबों:


310
return car.GetType().GetProperty(propertyName).GetValue(car, null);

17
ध्यान रखें कि चूंकि यह प्रतिबिंब का उपयोग करता है, इसलिए यह बहुत धीमा है। शायद एक मुद्दा नहीं है, लेकिन इसके बारे में पता होना अच्छा है।
मैट ग्रीर

"स्ट्रिंग से बाइंडिंगफ्लैग्स में परिवर्तित नहीं किया जा सकता"
क्रिस्टीन

5
क्या कोई "तेज़" तरीका @MattGreer है?
FizxMike

44

आपको प्रतिबिंब का उपयोग करना होगा

public object GetPropertyValue(object car, string propertyName)
{
   return car.GetType().GetProperties()
      .Single(pi => pi.Name == propertyName)
      .GetValue(car, null);
}

यदि आप वास्तव में फैंसी बनना चाहते हैं, तो आप इसे एक विस्तार विधि बना सकते हैं:

public static object GetPropertyValue(this object car, string propertyName)
{
   return car.GetType().GetProperties()
      .Single(pi => pi.Name == propertyName)
      .GetValue(car, null);
}

और तब:

string makeValue = (string)car.GetPropertyValue("Make");

आप SetValue के बजाय GetValue चाहते हैं
मैट ग्रीर

क्या मैं एक SetValue के लिए भी ऐसा कर सकता हूं? कैसे?
पिएरो अल्बर्टो

1
मामूली बात- विस्तार विधि शायद चर का नाम रखने की जरूरत नहीं हैcar
KyleMit

प्रॉपर्टी वैल्यू सेट करने का तरीका जानने के लिए, प्रॉपर्टीनामे स्ट्रिंग के आधार पर, इसका उत्तर यहां देखें: प्रतिबिंब के माध्यम से गुणों का मान सेट करना
nwsmith

35

आप रिफ्लेक्शन चाहते हैं

Type t = typeof(Car);
PropertyInfo prop = t.GetProperty("Make");
if(null != prop)
return prop.GetValue(this, null);

7
+1 यह सबसे अच्छा जवाब है क्योंकि आप सभी मध्यवर्ती वस्तुओं को दिखा रहे हैं
मैट ग्रीर

1
संपत्ति मूल्य पारित करने के बजाय क्या मैं सूचकांक पारित कर सकता हूं और संपत्ति का नाम और मूल्य प्राप्त कर सकता हूं (इसलिए मैं सभी संपत्ति के माध्यम से लूप कर सकता हूं)?
सिंहस्वत

@ सिंघस्वत आपको एक नए प्रश्न के रूप में पूछना चाहिए।
चक

7

सरल नमूना (क्लाइंट में प्रतिबिंब प्रतिबिंब कोड के बिना)

class Customer
{
    public string CustomerName { get; set; }
    public string Address { get; set; }
    // approach here
    public string GetPropertyValue(string propertyName)
    {
        try
        {
            return this.GetType().GetProperty(propertyName).GetValue(this, null) as string;
        }
        catch { return null; }
    }
}
//use sample
static void Main(string[] args)
    {
        var customer = new Customer { CustomerName = "Harvey Triana", Address = "Something..." };
        Console.WriteLine(customer.GetPropertyValue("CustomerName"));
    }

7

इसके अलावा अन्य लोग जवाब देते हैं, इसका आसान विस्तार विधि द्वारा किसी भी वस्तु का संपत्ति मूल्य प्राप्त करना है जैसे:

public static class Helper
    {
        public static object GetPropertyValue(this object T, string PropName)
        {
            return T.GetType().GetProperty(PropName) == null ? null : T.GetType().GetProperty(PropName).GetValue(T, null);
        }

    }

उपयोग है:

Car foo = new Car();
var balbal = foo.GetPropertyValue("Make");

7

एडम रैकिस के जवाब पर विस्तार - हम विस्तार विधि को इस तरह से सामान्य बना सकते हैं:

public static TResult GetPropertyValue<TResult>(this object t, string propertyName)
{
    object val = t.GetType().GetProperties().Single(pi => pi.Name == propertyName).GetValue(t, null);
    return (TResult)val;
}

यदि आप चाहें तो आप कुछ त्रुटि से निपटने के आसपास भी फेंक सकते हैं।


1

प्रतिबिंब से बचने के लिए आप शब्दकोश मान भाग में कुंजियों और कार्यों के रूप में अपने उचित नामों के साथ एक शब्दकोश सेट कर सकते हैं जो आपके द्वारा अनुरोध किए गए गुणों से संबंधित मान लौटाते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.