কিভাবে একটি শ্রেণীর বৈশিষ্ট্য তালিকা পেতে?


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
সম্পূর্ণতার জন্য, কম্পোনেন্টমোডেলও রয়েছে, যা টাইপডেস্কিটার দ্বারা প্রকাশিত হয় etGetProperties (...) - যা গতিশীল রানটাইম বৈশিষ্ট্যগুলিকে মঞ্জুরি দেয় (সংকলন-সময়ে প্রতিবিম্বটি স্থির করা হয়)।
মার্ক গ্র্যাভেল

5
পরামর্শ: সুরক্ষিত / প্রাইভেট / স্ট্যাটিক / উত্তরাধিকার সূত্রে প্রাপ্ত সম্পত্তির উত্তর প্রসারিত করুন।
রিচার্ড

1
আপনি যে ফোরচ স্টেটমেন্টটি প্রদর্শন করেন তা এমনকি শ্রেণীর মধ্যে থেকে কাজ করে আপনি :) এর বৈশিষ্ট্য পেতে চান
অর্ধপতুষ্পাণ্য.কাল

অতিরিক্ত মন্তব্যগুলি যেভাবে বর্ণিত হয়েছে তা থেকে এটি আমার কাছে পরিষ্কার ছিল না, তবে সমস্ত 3 টি পতাকা ব্যবহার করে আপনি internalসম্পত্তিও পাবেন। সম্ভবত আমিই সেই ব্যক্তি যে private/ non-publicসিনট্যাক্সটিতে ঝুলতে পেরেছি ?
brichins

1
@ তাদেজ আপনি কোন কাঠামোটিকে লক্ষ্য করছেন? আপনি যদি নেট নেট ব্যবহার করছেন তবে আপনার অবশ্যই using System.Reflectionনির্দেশনা এবং System.Reflection.TypeExtensionsপ্যাকেজটি রেফারেন্স রয়েছে তা নিশ্চিত করা দরকার - এটি এক্সটেনশন পদ্ধতির মাধ্যমে হারিয়ে যাওয়া এপিআই পৃষ্ঠ সরবরাহ করে
মার্ক গ্র্যাভেল

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[]{});
}

এছাড়াও, কেবলমাত্র সর্বজনীন সম্পত্তি পেতে: ( বাইন্ডিংফ্লাগ এনামে এমএসডিএন দেখুন )

/* 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) prp ফিরতে চলেছে?
মার্ক গ্র্যাভেল

5
পাবলিক প্রোপার্টি বিট সম্পর্কিত, লিঙ্কযুক্ত এমএসডিএন নিবন্ধ অনুসারে: "দ্রষ্টব্য আপনাকে অবশ্যই সরকারী বা নন-প্রজাতন্ত্রের সাথে ইনস্ট্যান্স বা স্ট্যাটিক নির্দিষ্ট করতে হবে বা কোনও সদস্যকে ফেরত দেওয়া হবে না"। সুতরাং নমুনা কোডটি হওয়া উচিত: 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। এটি কোনও বড় বিষয় নয়, তবে এটি করার আরও ভাল উপায়।
ম্যাথু হগেন

1
আমি এটি পছন্দ করি কারণ এটি (প্রায়) একমাত্র উত্তর যা প্রতিচ্ছবি শব্দটি অন্তর্ভুক্ত করে না ।

9
তবে এটি তবুও প্রতিবিম্ব ব্যবহার করে।
জিজিজি

2
আমি অনুমান এই অনেক ভালো pObject.GetType আছে () GetProperties () নির্বাচন করুন (P =>
হতাশ

23

আপনি মেহোদের System.Reflectionসাথে নেমস্পেসটি ব্যবহার করতে পারেন Type.GetProperties():

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

23

@ মার্কগ্রাভেলের উত্তরের ভিত্তিতে, এখানে একটি সংস্করণ রয়েছে যা ইউনিটি সি # তে কাজ করে।

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();
 }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.