সি # শ্রেণীর বৈশিষ্ট্যগুলির মাধ্যমে আইট্রেট করুন


118

আমি বর্তমানে আমার শ্রেণীর অবজেক্টের সমস্ত মান নির্ধারণ করছি Record

এই কোডটি আমি এই মুহূর্তে রেকর্ডটি জনপ্রিয় করতে ব্যবহার করছি, সম্পত্তি দ্বারা সম্পত্তি।

// Loop through each field in the result set
for (int i = 0; i <= resultItems.Length; i++)
{

    Record newRecord = new Record()
    {
            itemtype =   resultItems[i - (fieldCount - 0)],
            itemdesc =   resultItems[i - (fieldCount - 1)],
            prodcode =   resultItems[i - (fieldCount - 2)],
            proddesc =   resultItems[i - (fieldCount - 3)],
            curstat =    resultItems[i - (fieldCount -4)],
            totfree =    resultItems[i - (fieldCount -5)],
            totphys =    resultItems[i - (fieldCount -6)],
            pcolgroup =  resultItems[i - (fieldCount -7)],
            scolgroup =  resultItems[i - (fieldCount -8)],
            totpo =      resultItems[i - (fieldCount - 9)],
            totso =      resultItems[i - (fieldCount - 10)],
            quality =    resultItems[i - (fieldCount - 11)],
            statusdesc = resultItems[i - (fieldCount - 12)],
            groupcode =  resultItems[i - (fieldCount - 13)],
            qualitydes = resultItems[i - (fieldCount - 14)],
            pcoldesc =   resultItems[i - (fieldCount - 15)],
            scoldesc =   resultItems[i - (fieldCount - 16)],
            pgroupdesc = resultItems[i - (fieldCount - 17)],
    };
}

সম্পত্তির সমস্ত নামকে কঠোরভাবে কোডিং না করেই কি আমি প্রতিটি বৈশিষ্ট্যের মধ্য দিয়ে গতিশীলভাবে পুনরাবৃত্তি করতে পারি?

এরকম কিছু:

// Create new Record instance
Record newRecord = new Record();

for (int e = 0; e < propertyCount.Length - 1; e++)
{
    newRecord[fieldname] = resultItems[i - (fieldCount - e)];
}

1
আপনি প্রতিবিম্ব চেষ্টা করেছেন? stackoverflow.com/questions/997747/…
kol

1
pls এই লিঙ্কটি একবার দেখুন: stackoverflow.com/questions/721441/…
এনিগমা রাজ্য

আপনি কীভাবে ব্যাখ্যা করতে পারবেন কোথায় এবং কীভাবে আপনি ফলাফল এবং আইটেমির অ্যারেতে কোনও সংস্থান এবং সূচকের মধ্যে সম্পর্ক বজায় রাখতে চান?
এরনো

উত্তর:


226

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

একটি ইঙ্গিতের জন্য, আপনি সম্ভবত এর মতো কিছু করতে পারেন:

Record record = new Record();

PropertyInfo[] properties = typeof(Record).GetProperties();
foreach (PropertyInfo property in properties)
{
    property.SetValue(record, value);
}

valueআপনি যে মানটি লিখতে চান তা কোথায় (তাই আপনার resultItemsঅ্যারে থেকে )।


1
আমি যদি ব্যবহার করতে চান property.Getvalue (someOtherClassObjectHavingExacltySameProperties) একটি পরিবর্তে মান ? (আমি এই চেষ্টা ; সম্পত্তি .SetValue (objAppointment, property.GetValue (টেম্প))? কিন্তু এটা আমার দেয়, { "অবজেক্ট লক্ষ্য প্রকারের সঙ্গে মিলছে না।"} )
আসিফ মেহমুদ

@ মালিকএসিফ আমি নিশ্চিত যে আমি পুরোপুরি বুঝতে পেরেছি না তবে মনে হচ্ছে আপনি অন্য ধরণের কোনও সম্পত্তি লোড করার চেষ্টা করছেন। আপনি যদি উদাহরণের সাথে এসও-তে কোনও প্রশ্ন পোস্ট করেন এবং এটি এখানে লিঙ্ক করেন, আমি আপনার খোঁজ নেব।
স্যামুয়েল স্লেড

1
এটি পরম জীবন রক্ষাকারী - আপনাকে ধন্যবাদ! আমার মান আছে কিনা তা পরীক্ষা করতে আমি সমস্ত শ্রেণীর বৈশিষ্ট্যগুলিতে পুনরাবৃত্তি করছি (এটি এক্সএমএল লিখার আগে)
কর্ডেল

@ কর্ডেল, আপনি এটি কীভাবে করলেন? আমি সম্পত্তি চেষ্টা করেছি।
ব্যবহারকারী 7792598

@ user7792598 আপনি যে বস্তুটি থেকে সম্পত্তিটির মূল্য পেতে চান তা আপনাকে পাস করতে হবে। আপনার যদি আরও সহায়তার প্রয়োজন হয় তবে স্ট্যাক ওভারফ্লো প্রশ্নটি পোস্ট করুন
স্যামুয়েল স্লেড

17
// the index of each item in fieldNames must correspond to 
// the correct index in resultItems
var fieldnames = new []{"itemtype", "etc etc "};

for (int e = 0; e < fieldNames.Length - 1; e++)
{
    newRecord
       .GetType()
       .GetProperty(fieldNames[e])
       .SetValue(newRecord, resultItems[e]);
}

1
এটি দেখতে দুর্দান্ত দেখাচ্ছে, তবে আমি সেখানে ফিল্ড নেমগুলি হার্ড কোডিংয়ের পরিবর্তে এটি গতিশীল করার জন্য আশা করছিলাম। এটা কি সম্ভব? ধন্যবাদ
লুক

এছাড়াও মনে হয় GetPropertyসম্পত্তিটি আমার শ্রেণীর উদাহরণের জন্য উপলব্ধ নয়। : /
লুক

না, ফলাফল আইটেম সূচী এবং সম্পত্তির নামের মধ্যে কোথাও একটি ম্যাপিং হওয়া দরকার।
jgauffin

1
@ কুলটন আপনি কীভাবে প্রতিটি সম্পত্তি গতিশীলভাবে একটি সূচকে যুক্ত করতে পারেন? এটা সম্ভব না.
এমি

আপনি nameof(Item.Field)পরিবর্তে চেষ্টা করতে পারেন"itemtype" সি # 6.0 এর মতো হার্ড কোডিং এড়ানোর
প্যাট্রিক মাইকেলসেন

2

হ্যাঁ, আপনি আপনার রেকর্ড শ্রেণিতে এমন একটি সূচক তৈরি করতে পারেন যা সম্পত্তির নাম থেকে সঠিক সম্পত্তির মানচিত্র। এটি সম্পত্তির নাম থেকে সম্পত্তি পর্যন্ত সমস্ত স্থায়ীভাবে এক জায়গায় রাখবে যেমন:

public class Record
{
    public string ItemType { get; set; }

    public string this[string propertyName]
    {
        set
        {
            switch (propertyName)
            {
                case "itemType":
                    ItemType = value;
                    break;
                    // etc
            }   
        }
    }
}

বিকল্প হিসাবে, অন্যরা যেমন বলেছে, প্রতিবিম্ব ব্যবহার করুন।


1

স্যামুয়েল স্লেড যা বলেছিল তা আমি চেষ্টা করেছি । আমার পক্ষে কাজ করেনি। PropertyInfo তালিকা খালি যেমন আসছিল। সুতরাং, আমি নিম্নলিখিতগুলি চেষ্টা করেছিলাম এবং এটি আমার পক্ষে কাজ করে।

    Type type = typeof(Record);
    FieldInfo[] properties = type.GetFields();
    foreach (FieldInfo property in properties) {
       Debug.LogError(property.Name);
    }

1
এটি হ'ল কারণ আপনার ধরণেরটিতে কেবল ক্ষেত্র রয়েছে, বৈশিষ্ট্য নেই !?
জামহেডার্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.