클래스 속성을 통해 C # 반복


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
Reflection을 사용해 보셨습니까? stackoverflow.com/questions/997747/…
kol 2011

1
pls는이 링크를 살펴 봅니다 stackoverflow.com/questions/721441/…
Enigma State

resultItems 배열에서 속성과 인덱스 간의 관계를 유지하려는 위치와 방법을 설명해 주시겠습니까?
Erno 2011

답변:


226

이를 위해 Reflection을 사용할 수 있습니다. 내가 이해하는 한, 클래스의 속성을 열거하고 값을 설정할 수 있습니다. 이것을 시도하고 속성의 순서를 이해했는지 확인해야합니다. 이 접근 방식에 대한 자세한 내용은 이 MSDN 설명서 를 참조하십시오.

힌트를 얻으려면 다음과 같이 할 수 있습니다.

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 (임시));? 하지만 그것이 나에게주는 { "개체는 대상 유형과 일치하지 않습니다."} )
아시프 Mehmood

@MalikAsif 내가 완전히 이해하고 있는지 확실하지 않지만 다른 유형에서 속성을로드하려는 것 같습니다. 예와 함께 SO에 대한 질문을 게시하고 여기에 링크하면 내가 당신을 찾을 것입니다.
사무엘 슬레이드

1
이것은 절대적인 생명의 은인입니다-감사합니다! 값이 있는지 확인하기 위해 모든 클래스 속성을 반복하고 있습니다 (XML에 쓰기 전에)
Cordell

@Cordell, 어떻게 그랬어? property.GetValue ()를 시도했지만 매개 변수로 개체를 요청합니다.
user7792598

@ user7792598 속성 값을 가져 오려는 개체를 전달해야합니다. 도움이 더 필요하면 다른 StackOverflow의 질문 게시
사무엘 슬레이드

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
이것은 좋아 보이지만 거기에 필드 이름을 하드 코딩하는 대신 동적으로 수행하기를 바랐습니다. 이게 가능해? 감사합니다
Luke

또한 GetProperty내 클래스 인스턴스에 속성을 사용할 수없는 것 같습니다 . : /
Luke

아니요, resultItem 인덱스와 속성 이름 사이에 매핑이 있어야합니다.
jgauffin 2011

1
@Coulton 각 속성을 인덱스에 동적으로 연결하는 방법은 무엇입니까? 그건 불가능하다.
Amy

당신은 시도 할 수 있습니다 nameof(Item.Field)대신 "itemtype"하드 6.0 C #의로 코딩을 피하기 위해
패트릭 Michaelsen

2

예, 속성 이름에서 올바른 속성으로 매핑되는 Record 클래스에 인덱서를 만들 수 있습니다. 이것은 속성 이름에서 속성으로의 모든 바인딩을 한 곳에서 유지합니다.

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

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

또는 다른 사람들이 언급했듯이 반사를 사용하십시오.


1

나는 Samuel Slade 가 제안한 것을 시도 했습니다. 나를 위해 일하지 않았다. PropertyInfo 목록이 비어로오고 있었다. 그래서 나는 다음을 시도했고 그것은 나를 위해 일했습니다.

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

1
유형에 속성이 아닌 필드 만 있기 때문입니다!?
jamheadart
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.