অজানা অবজেক্ট থেকে বৈশিষ্ট্য এবং মানগুলি পান


150

পিএইচপি এর বিশ্ব থেকে আমি সি # একবার যেতে সিদ্ধান্ত নিয়েছি। আমি একটি অনুসন্ধান করেছি কিন্তু এর সমতুল্য কীভাবে করা যায় তার উত্তর খুঁজে পাওয়া যায় না।

$object = new Object();

$vars = get_class_vars(get_class($object));

foreach($vars as $var)
{
    doSomething($object->$var);
}

আমার কাছে মূলত একটি অবজেক্টের একটি তালিকা রয়েছে। অবজেক্টটি তিনটি বিভিন্ন ধরণের একটি হতে পারে এবং এতে সর্বজনীন বৈশিষ্ট্যের একটি সেট থাকবে। আমি অবজেক্টের জন্য বৈশিষ্ট্যের একটি তালিকা পেতে সক্ষম করতে চাই, সেগুলির উপর লুপ করে এবং তারপরে একটি ফাইলে লিখতে চাই। আমি ভাবছি সি # এর প্রতিবিম্বের সাথে এর কিছু করার আছে তবে এটি আমার কাছে নতুন।

কোন সাহায্যের ব্যাপকভাবে প্রশংসা হবে।


9
পার্শ্ব নোট হিসাবে: তালিকায় বিভিন্ন ধরণের অবজেক্ট থাকা (সাধারণ বেস শ্রেণি বা ইন্টারফেস ছাড়াই) ভাল প্রোগ্রামিং শৈলী নয়, কমপক্ষে সি # তে নয়।
আলবিন সুন্নানবো

উত্তর:


284

এটি করা উচিত:

Type myType = myObject.GetType();
IList<PropertyInfo> props = new List<PropertyInfo>(myType.GetProperties());

foreach (PropertyInfo prop in props)
{
    object propValue = prop.GetValue(myObject, null);

    // Do something with propValue
}

প্রপার্টিআইএনফো কোথা থেকে আসে?
জনাথন ডস সান্টোস

8
@ জোনাথন System.Reflectionনেমস্পেস
কোকোয়াল্লা

21
অ্যারে থেকে কেবল একটি তালিকা তৈরি করার দরকার নেই, কেবলPropertyInfo[] props = input.GetType().GetProperties();
ভ্ল্যাডএল

2
আপনি কি ব্যবহার করে 2017 উত্তরের জন্য আপডেট করতে চান Newtonsoft.Json.JsonConvert?
ভাইয়েন

1
@ ক্লোন এটি করার সম্পূর্ণ ভিন্ন উপায়। আপনার যদি একটি উত্তর পোস্ট করা উচিত তবে আপনি যদি মনে করেন যে এটি একটি বৈধ পন্থা
কোকোওয়ালা

23
void Test(){
    var obj = new{a="aaa", b="bbb"};

    var val_a = obj.GetValObjDy("a"); //="aaa"
    var val_b = obj.GetValObjDy("b"); //="bbb"
}
//create in a static class
static public object GetValObjDy(this object obj, string propertyName)
{            
     return obj.GetType().GetProperty(propertyName).GetValue(obj, null);
}

17

হ্যাঁ, প্রতিচ্ছবি হ'ল উপায় হবে। প্রথমত, আপনি Typeতালিকার দৃষ্টান্তটির (রানটাইম সময়ে) ধরণের প্রতিনিধিত্ব করবেন। আপনি GetTypeপদ্ধতিটিObject কল করে এটি করতে পারেন । এটি Objectক্লাসে রয়েছে বলে, এটি নেট। প্রতিটি আইটেম দ্বারা কলযোগ্য , যেমন সমস্ত ধরণের থেকে প্রাপ্ত Object( ভাল, প্রযুক্তিগতভাবে, সমস্ত কিছু নয় , তবে এটি এখানে গুরুত্বপূর্ণ নয়)।

একবার Typeউদাহরণস্বরূপ উপস্থিত হয়ে গেলে , আপনি সেই বৈশিষ্ট্যগুলি খুঁজে পেতে GetPropertiesপদ্ধতিটি কল করতে পারেন PropertyInfoযা উপরের বৈশিষ্ট্যগুলি সম্পর্কে রান-টাইম তথ্য উপস্থাপন করে Type

দ্রষ্টব্য, আপনি কোন বৈশিষ্ট্য পুনরুদ্ধার করবেন তাGetProperties শ্রেণিবদ্ধ করতে সহায়তা করতে আপনি ওভারলোডগুলি ব্যবহার করতে পারেন ।

সেখান থেকে, আপনি কেবল একটি ফাইলের জন্য তথ্য লিখবেন।

উপরে বর্ণিত আপনার কোডটি হ'ল:

// The instance, it can be of any type.
object o = <some object>;

// Get the type.
Type type = o.GetType();

// Get all public instance properties.
// Use the override if you want to classify
// which properties to return.
foreach (PropertyInfo info in type.GetProperties())
{
    // Do something with the property info.
    DoSomething(info);
}

নোট করুন যে আপনি যদি পদ্ধতি সম্পর্কিত তথ্য বা ক্ষেত্রের তথ্য চান তবে আপনাকে যথাক্রমে GetMethodsবা GetFieldsপদ্ধতিগুলির ওভারলোডগুলির একটিতে কল করতে হবে ।

আরও মনে রাখবেন, সদস্যদের একটি ফাইলে তালিকাভুক্ত করা একটি জিনিস, তবে সম্পত্তি সেটের উপর ভিত্তি করে যুক্তি চালানোর জন্য আপনার এই তথ্য ব্যবহার করা উচিত নয়

ধরে নেওয়া যাক আপনি ধরনের বাস্তবায়নের নিয়ন্ত্রণ আছে, তবে আপনি একটি সাধারণ বেস ক্লাস থেকে আহরণ করা বা একটি সাধারণ ইন্টারফেস বাস্তবায়ন এবং যারা উপর কল করতে হবে (আপনি ব্যবহার করতে পারেন asবা isসাহায্যের অপারেটর তা নির্ধারণ বেস বর্গ / তোমার দিকে সাথে কাজ করেন, ইন্টারফেস রানটাইম)।

তবে, আপনি যদি এই ধরণের সংজ্ঞাগুলি নিয়ন্ত্রণ না করেন এবং প্যাটার্ন মিলের ভিত্তিতে লজিক চালনা করতে পারেন তবে তা ঠিক।


11

ভাল, সি # তে এটি একই রকম। এখানে সরল উদাহরণগুলির মধ্যে একটি (কেবল সর্বজনীন সম্পত্তিগুলির জন্য):

var someObject = new { .../*properties*/... };
var propertyInfos = someObject.GetType().GetProperties();
foreach (PropertyInfo pInfo in PropertyInfos)
{
    string propertyName = pInfo.Name; //gets the name of the property
    doSomething(pInfo.GetValue(someObject,null));
}

9

সম্পত্তি নাম থেকে নির্দিষ্ট সম্পত্তি মান পেতে

public class Bike{
public string Name {get;set;}
}

Bike b = new Bike {Name = "MyBike"};

সম্পত্তির স্ট্রিং নাম থেকে নামের সম্পত্তি বৈশিষ্ট্য অ্যাক্সেস করতে

public object GetPropertyValue(string propertyName)
{
//returns value of property Name
return this.GetType().GetProperty(propertyName).GetValue(this, null);
} 

3

আপনি গেটটাইপ - গেটপোপার্টি - লিনক ফোরচ ব্যবহার করতে পারেন :

obj.GetType().GetProperties().ToList().ForEach(p =>{
                                                        //p is each PropertyInfo
                                                        DoSomething(p);
                                                    });

3

লিনক ব্যবহার করে একটি লাইন সমাধান ...

var obj = new {Property1: 1, Property2: 2};
var property1 = obj.GetType().GetProperties().First(o => o.Name == "Property1").GetValue(obj , null);

2

এখানে কিছু আমি একজন রুপান্তর করতে ব্যবহার করেন IEnumerable<T>একটি মধ্যে DataTableযে কলাম প্রতিনিধিত্বমূলক রয়েছে Tএর সম্পত্তি, প্রতিটি আইটেমের জন্য এক সারি সঙ্গে IEnumerable:

public static DataTable ToDataTable<T>(IEnumerable<T> items)
{
    var table = CreateDataTableForPropertiesOfType<T>();
    PropertyInfo[] piT = typeof(T).GetProperties();
    foreach (var item in items)
    {
        var dr = table.NewRow();
        for (int property = 0; property < table.Columns.Count; property++)
        {
            if (piT[property].CanRead)
            {
                var value = piT[property].GetValue(item, null);
                if (piT[property].PropertyType.IsGenericType)
                {
                    if (value == null)
                    {
                        dr[property] = DBNull.Value;
                    }
                    else
                    {
                        dr[property] = piT[property].GetValue(item, null);
                    }
                }
                else
                {
                    dr[property] = piT[property].GetValue(item, null);
                }
            }
        }
        table.Rows.Add(dr);
    }
    return table;
}

public static DataTable CreateDataTableForPropertiesOfType<T>()
{
    DataTable dt = new DataTable();
    PropertyInfo[] piT = typeof(T).GetProperties();
    foreach (PropertyInfo pi in piT)
    {
        Type propertyType = null;
        if (pi.PropertyType.IsGenericType)
        {
            propertyType = pi.PropertyType.GetGenericArguments()[0];
        }
        else
        {
            propertyType = pi.PropertyType;
        }
        DataColumn dc = new DataColumn(pi.Name, propertyType);

        if (pi.CanRead)
        {
            dt.Columns.Add(dc);
        }
    }
    return dt;
}

এটি "কিছুটা" অত্যধিক জটিল, তবে ফলাফলটি কী তা দেখার জন্য এটি আসলে বেশ ভাল, যেমন আপনি এটির একটি List<T>উদাহরণ দিতে পারেন :

public class Car
{
    string Make { get; set; }
    int YearOfManufacture {get; set; }
}

এবং আপনাকে কাঠামোর সাথে একটি ডেটা টেবিল ফিরিয়ে দেওয়া হবে:

মেক (STRING)
YearOfManufacture (int-)

আপনার আইটেম প্রতি এক সারি List<Car>


1

এই উদাহরণটি কোনও বস্তুর সমস্ত স্ট্রিং বৈশিষ্ট্য ছাঁটাই করে।

public static void TrimModelProperties(Type type, object obj)
{
    var propertyInfoArray = type.GetProperties(
                                    BindingFlags.Public | 
                                    BindingFlags.Instance);
    foreach (var propertyInfo in propertyInfoArray)
    {
        var propValue = propertyInfo.GetValue(obj, null);
        if (propValue == null) 
            continue;
        if (propValue.GetType().Name == "String")
            propertyInfo.SetValue(
                             obj, 
                             ((string)propValue).Trim(), 
                             null);
    }
}

0

অ্যাপ্লিকেশন অবজেক্টগুলি বলুন, আমি এটিতে কাজ করতে পাইনি। আমি তবে সাফল্য পেয়েছি

var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();

string rval = serializer.Serialize(myAppObj);

2
আপনি যদি এড়াতে পারেন তবে জাভাস্ক্রিপ্টসিরাইজার ব্যবহার করবেন না। অনেক বড় কারণ আছে
নুনো আন্দ্রে

0
public Dictionary<string, string> ToDictionary(object obj)
{
    Dictionary<string, string> dictionary = new Dictionary<string, string>();

    Type objectType = obj.GetType();
    IList<PropertyInfo> props = new List<PropertyInfo>(objectType.GetProperties());

    foreach (PropertyInfo prop in props)
    {
        object propValue = prop.GetValue(obj, null);
        dictionary.Add(prop.Name, propValue.ToString());
    }

    return dictionary;
}

0
    /// get set value field in object to object new (two object  field like ) 

    public static void SetValueObjectToObject (object sourceObj , object resultObj)
    {
        IList<PropertyInfo> props = new List<PropertyInfo>(sourceObj.GetType().GetProperties());
        foreach (PropertyInfo prop in props)
        {
            try
            {
                //get value in sourceObj
                object propValue = prop.GetValue(sourceObj, null);
                //set value in resultObj
                PropertyInfo propResult = resultObj.GetType().GetProperty(prop.Name, BindingFlags.Public | BindingFlags.Instance);
                if (propResult != null && propResult.CanWrite)
                {
                    propResult.SetValue(resultObj, propValue, null);
                }
            }
            catch (Exception ex)
            {  
                // do something with Ex
            }
        }
    }

-1

আপনি এটি চেষ্টা করতে পারেন:

string[] arr = ((IEnumerable)obj).Cast<object>()
                                 .Select(x => x.ToString())
                                 .ToArray();

একবার প্রতিটি অ্যারে IEnumerable ইন্টারফেস প্রয়োগ করে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.