किसी वर्ग की संपत्तियों की सूची कैसे प्राप्त करें?


597

मुझे किसी वर्ग के सभी गुणों की सूची कैसे मिल सकती है?

जवाबों:


797

प्रतिबिंब; एक उदाहरण के लिए:

obj.GetType().GetProperties();

एक प्रकार के लिए:

typeof(Foo).GetProperties();

उदाहरण के लिए:

class Foo {
    public int A {get;set;}
    public string B {get;set;}
}
...
Foo foo = new Foo {A = 1, B = "abc"};
foreach(var prop in foo.GetType().GetProperties()) {
    Console.WriteLine("{0}={1}", prop.Name, prop.GetValue(foo, null));
}

प्रतिक्रिया के बाद ...

  • स्थिर गुणों का मान प्राप्त करने के लिए, nullपहले तर्क के रूप में पास करेंGetValue
  • गैर-सार्वजनिक संपत्तियों को देखने के लिए, उपयोग करें (उदाहरण के लिए) GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)(जो सभी सार्वजनिक / निजी उदाहरण गुण लौटाता है)।

13
पूर्णता के लिए, CompDMcriptel.GetProperties (...) - जो डायनेमिक रनटाइम गुण (प्रतिबिंब संकलन समय पर तय हो गई है) की अनुमति देता है, ComponentModel भी है।
मार्क Gravell

5
सुझाव: संरक्षित / निजी / स्थिर / विरासत में मिली संपत्तियों को कवर करने के लिए उत्तर का विस्तार करें।
रिचर्ड

1
आपके द्वारा प्रदर्शित की जाने वाली फ़ॉर्चेट स्टेटमेंट उस वर्ग के भीतर से भी काम करती है जहाँ आप गुण प्राप्त करना चाहते हैं :)
halfpastfour.am

यह मुझे उस तरह से स्पष्ट नहीं था जिस तरह से अतिरिक्त टिप्पणियां बताई गई हैं, लेकिन सभी 3 झंडों का उपयोग करने से आपको internalगुण भी मिलते हैं । शायद मैं केवल एक ही हूं जो private/ non-publicवाक्य रचना पर लटका हुआ है ?
ब्रिचिन्स

1
@ तद्ज आप किस रूपरेखा को लक्षित कर रहे हैं? आप नेट कोर उपयोग कर रहे हैं तो आप यह सुनिश्चित करने के लिए आपके पास जरूरत using System.Reflectionके निर्देश और System.Reflection.TypeExtensionsइस विस्तार विधियों के माध्यम से याद आ रही एपीआई सतह प्रदान करता है - पैकेज संदर्भित
मार्क Gravell

91

आप इसे करने के लिए प्रतिबिंब का उपयोग कर सकते हैं : (मेरी लाइब्रेरी से - यह नाम और मान प्राप्त करता है)

public static Dictionary<string, object> DictionaryFromType(object atype)
{
    if (atype == null) return new Dictionary<string, object>();
    Type t = atype.GetType();
    PropertyInfo[] props = t.GetProperties();
    Dictionary<string, object> dict = new Dictionary<string, object>();
    foreach (PropertyInfo prp in props)
    {
        object value = prp.GetValue(atype, new object[]{});
        dict.Add(prp.Name, value);
    }
    return dict;
}

यह चीज़ एक अनुक्रमणिका वाले गुणों के लिए काम नहीं करेगी - उसके लिए (यह अस्पष्ट है):

public static Dictionary<string, object> DictionaryFromType(object atype, 
     Dictionary<string, object[]> indexers)
{
    /* replace GetValue() call above with: */
    object value = prp.GetValue(atype, ((indexers.ContainsKey(prp.Name)?indexers[prp.Name]:new string[]{});
}

इसके अलावा, केवल सार्वजनिक संपत्ति पाने के लिए: ( बंधन पर MSDN देखें )

/* replace */
PropertyInfo[] props = t.GetProperties();
/* with */
PropertyInfo[] props = t.GetProperties(BindingFlags.Public)

यह अनाम प्रकारों पर भी काम करता है!
सिर्फ नाम पाने के लिए:

public static string[] PropertiesFromType(object atype)
{
    if (atype == null) return new string[] {};
    Type t = atype.GetType();
    PropertyInfo[] props = t.GetProperties();
    List<string> propNames = new List<string>();
    foreach (PropertyInfo prp in props)
    {
        propNames.Add(prp.Name);
    }
    return propNames.ToArray();
}

और यह केवल मूल्यों के लिए उसी के बारे में है, या आप इसका उपयोग कर सकते हैं:

GetDictionaryFromType().Keys
// or
GetDictionaryFromType().Values

लेकिन यह थोड़ा धीमा है, मैं कल्पना करूंगा।


... लेकिन atype.GetProperty (prp.Name) पीआरपी वापस करने जा रहा है?
मार्क Gravell

5
लिंक किए गए MSDN लेख के अनुसार, सार्वजनिक संपत्तियों के बारे में: "नोट आपको सार्वजनिक या गैर-गणतंत्र के साथ इंस्टेंस या स्टेटिक निर्दिष्ट करना होगा या कोई सदस्य वापस नहीं किया जाएगा।" तो नमूना कोड होना चाहिए: t.GetProperties(BindingFlags.Instance | BindingFlags.Public)याt.GetProperties(BindingFlags.Static | BindingFlags.Public)
कार्ल शरमन

कोड की तलाश नहीं थी, मैं प्रतिबिंब और वाह के स्पष्टीकरण की तलाश कर रहा था, बहुत सराहना की! इसे सामान्य बनाएं और आप कह सकते हैं कि आपके कार्यक्रम में महाशक्तियाँ हैं;)
जयगढ़

37
public List<string> GetPropertiesNameOfClass(object pObject)
{
    List<string> propertyList = new List<string>();
    if (pObject != null)
    {
        foreach (var prop in pObject.GetType().GetProperties())
        {
            propertyList.Add(prop.Name);
        }
    }
    return propertyList;
}

यह फ़ंक्शन क्लास प्रॉपर्टीज़ की सूची प्राप्त करने के लिए है।


7
आप इसका उपयोग करने के लिए इसे बदलना चाह सकते हैं yield return। यह कोई बड़ी बात नहीं है, लेकिन यह इसे करने का एक बेहतर तरीका है।
मैथ्यू Haugen

1
मुझे यह पसंद है क्योंकि यह (लगभग) एकमात्र उत्तर है जिसमें शब्द प्रतिबिंब शामिल नहीं है ।

9
लेकिन यह अभी भी प्रतिबिंब का उपयोग करता है।
GGG

2
मुझे लगता है कि यह बहुत बेहतर है pObject.GetType ()। GetProperties ()। Select (p => p.Name)
निराश

23

आप System.Reflectionनेमस्पेस का उपयोग कर सकते हैं Type.GetProperties():

PropertyInfo[] propertyInfos;
propertyInfos = typeof(MyClass).GetProperties(BindingFlags.Public|BindingFlags.Static);

23

@ MarcGravell के उत्तर के आधार पर, यहां एक संस्करण है जो यूनिटी C # में काम करता है।

ObjectsClass foo = this;
foreach(var prop in foo.GetType().GetProperties()) {
    Debug.Log("{0}={1}, " + prop.Name + ", " + prop.GetValue(foo, null));
}

8

यही मेरा समाधान है

public class MyObject
{
    public string value1 { get; set; }
    public string value2 { get; set; }

    public PropertyInfo[] GetProperties()
    {
        try
        {
            return this.GetType().GetProperties();
        }
        catch (Exception ex)
        {

            throw ex;
        }
    }

    public PropertyInfo GetByParameterName(string ParameterName)
    {
        try
        {
            return this.GetType().GetProperties().FirstOrDefault(x => x.Name == ParameterName);
        }
        catch (Exception ex)
        {

            throw ex;
        }
    }

    public static MyObject SetValue(MyObject obj, string parameterName,object parameterValue)
    {
        try
        {
            obj.GetType().GetProperties().FirstOrDefault(x => x.Name == parameterName).SetValue(obj, parameterValue);
            return obj;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
}

6

आप प्रतिबिंब का उपयोग कर सकते हैं।

Type typeOfMyObject = myObject.GetType();
PropertyInfo[] properties =typeOfMyObject.GetProperties();

3

मैं भी इस तरह की आवश्यकता का सामना कर रहा हूं।

इस चर्चा से मुझे एक और आइडिया मिला,

Obj.GetType().GetProperties()[0].Name

यह संपत्ति का नाम भी दिखा रहा है।

Obj.GetType().GetProperties().Count();

इस गुण की संख्या दिखा रहा है।

सभी को धन्यवाद। यह अच्छी चर्चा है।


3

यहाँ @lucasjones उत्तर में सुधार किया गया है। मैंने उनके उत्तर के बाद टिप्पणी अनुभाग में उल्लिखित सुधारों को शामिल किया। मुझे आशा है कि किसी को यह उपयोगी लगेगा।

public static string[] GetTypePropertyNames(object classObject,  BindingFlags bindingFlags)
{
    if (classObject == null)
    {
        throw new ArgumentNullException(nameof(classObject));
    }

        var type = classObject.GetType();
        var propertyInfos = type.GetProperties(bindingFlags);

        return propertyInfos.Select(propertyInfo => propertyInfo.Name).ToArray();
 }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.