C # Sınıf özelliklerinde yineleme


118

Şu anda sınıf nesnemin tüm değerlerini ayarlıyorum Record.

Bu, şu anda kaydı mülke göre doldurmak için kullandığım koddur.

// 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)],
    };
}

Tüm özellik adlarını zor kodlamadan her bir özelliği dinamik olarak yineleyebilir miyim?

Öyle bir şey:

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

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

1
Reflection'ı denediniz mi? stackoverflow.com/questions/997747/…
kol

1
pls bu bağlantıya bir göz atın stackoverflow.com/questions/721441/…
Enigma State

ResultItems dizisindeki bir özellik ile dizin arasındaki ilişkiyi nerede ve nasıl sürdürmek istediğinizi açıklayabilir misiniz?
Erno

Yanıtlar:


226

Bunu yapmak için muhtemelen Yansıma kullanabilirsiniz. Anladığım kadarıyla, sınıfınızın özelliklerini sıralayabilir ve değerleri ayarlayabilirsiniz. Bunu denemeniz ve mülklerin sırasını anladığınızdan emin olmanız gerekir. Bu yaklaşımla ilgili daha fazla bilgi için bu MSDN Belgelerine bakın .

Bir ipucu için, muhtemelen şöyle bir şey yapabilirsiniz:

Record record = new Record();

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

valueYazmak istediğiniz değer nerede (yani resultItemsdizinizden).


1
Bir değer yerine property.Getvalue (someOtherClassObjectHavingExacltySameProperties) kullanmak istersem ne olur ? (Bu özelliği denedim mi? .SetValue (objAppointment, property.GetValue (temp)); ancak bana {"Nesne hedef türüyle eşleşmiyor."}
Veriyor

@MalikAsif tam olarak anladığımdan emin değilim, ancak farklı bir türden bir mülk yüklemeye çalışıyorsunuz gibi görünüyor. SO'ya bir örnek içeren bir soru gönderirseniz ve onu buraya bağlarsanız, sizi ararım.
Samuel Slade

1
Bu mutlak bir hayat kurtarıcıdır - teşekkürler! Bir değere sahip olduğumu kontrol etmek için tüm sınıf özelliklerini yineliyorum (XML'e yazmadan önce)
Cordell

@Cordell, bunu nasıl yaptın? Property.GetValue () denedim ama parametre olarak bir nesne istiyor.
user7792598

@ user7792598 Özellik değerini almak istediğiniz nesneyi girmeniz gerekir. Daha fazla yardıma ihtiyacınız olursa başka bir StackOverflow sorusu gönderin
Samuel Slade

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
Bu iyi görünüyor, ancak oradaki alan adlarını zor kodlamak yerine dinamik olarak yapmayı umuyordum. Mümkün mü? Teşekkürler
Luke

Ayrıca GetPropertyözelliğin sınıf örneğim için kullanılamadığı görülüyor . : /
Luke

hayır, resultItem dizinleri ile özellik adları arasında bir yerde bir eşleme olması gerekir.
jgauffin

1
@Coulton Her özelliği dinamik olarak bir dizine nasıl ilişkilendirmeyi bekliyorsunuz? Bu mümkün değil.
Amy

nameof(Item.Field)Bunun yerine "itemtype"C # 6.0
Patrick Michaelsen

2

Evet, Record sınıfınızda özellik adından doğru mülke eşleyen bir dizin oluşturucu yapabilirsiniz. Bu, mülk adından mülke olan tüm bağlamayı tek bir yerde tutar, örneğin:

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

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

Alternatif olarak, diğerlerinin de belirttiği gibi, yansımayı kullanın.


1

Samuel Slade'in önerdiği şeyi denedim . Benim için çalışmadı. PropertyInfo Liste boşsa olarak geliyordu. Bu yüzden aşağıdakileri denedim ve benim için çalıştı.

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

1
Bunun nedeni, türünüzde yalnızca alanlar olması, özellikler değil !?
jamheadart
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.