2011-11-09 2 views
3

인덱스로 동적 개체의 속성에 액세스하는 방법이 있습니까?C# DynamicObject : 인덱스로 속성에 액세스하는 방법이 있습니까?

List<dynamic> list = _dataStagingManager.GetStatusList(consoleSearch); 
foreach (var row in list) 
{ 
    Console.WriteLine(row[0]); 
    Console.WriteLine(row[1]); 
} 

이 예에서 행 [0]의 속성 이름은 저장 프로 시저 열 별칭의 결과에 따라 다릅니다.

+0

어떤 종류의 동적 객체입니까? 어디에서 가져다 줍니까? – svick

+0

처음에는 일반 동적 객체 유형 인 DynamicObject를 사용했습니다. Dapper가 반환 한 동적 객체가이 객체를 확장하고 Keys 및 Values ​​속성을 포함하고 있음을 알 수 있습니다. – Abe

답변

1

일반적으로 불가능합니다. 기회가있다

class AnythingGoes : DynamicObject 
{ 
    public override bool TryGetMember(GetMemberBinder binder, out object result) 
    { 
     result = binder.Name; 
     return true; 
    } 
} 

당신은 속성의 목록을 얻을 수있을 것입니다 : 예를 들어, 당신은 가능한 모든 속성이 동적 객체를 만들 수 있습니다. 동적 객체가 실제로 정상 객체 (IDynamicMetaObjectProvider을 구현하지 않는 객체) 인 경우 일반 반사가 정상적으로 작동합니다.

실제로 개체가 동적 인 경우 (IDynamicMetaObjectProvider 구현) 에서 GetMetaObject()에서 반환 된 GetDynamicMemberNames()을 호출 해 볼 수 있습니다. 그러나 위의 예에서 볼 수 있듯이 이것이 작동하는 것은 아닙니다.

-2

row의 런타임 유형에 정수 인덱서가있는 경우 코드를 그대로 유지해야합니다.

+1

이 예제를 제공해 주시겠습니까? 기본적으로 Dapper Dot Net에 의해 매핑 된 저장 프로 시저의 데이터 결과 집합을 포함하는 List 유형의 개체가 있습니다. – Abe

+0

Dapper Dot Net에 익숙하지 않습니다. 그러나 예를 들어, 행이 ADO.NET DataRow 인 경우 식 row [0]은 런타임에 인덱서에 전달되어 첫 번째 열 (및 두 번째 행 [1])에 저장된 값을 반환합니다. etc.) – phoog

4

불행히도, 아니요. 동적 객체와 달리 반복적으로 반영/쿼리 될 수있는 반복 가능한 객체 컬렉션이있는 런타임 객체와 달리 기본적으로 그러한 객체는 없습니다. 멤버를 이름으로 액세스 할 수있는 방법으로 구현할 수 있습니다. 동적 객체를 사용하여 인덱스를 구현하는 것을 선택하지 않는다면 동적 객체를 사용하는 인덱스에 대해서는 전혀 알 수 없습니다.

원하는 경우 동적 유형의 TryGetIndex 메서드를 재정 의하여 색인 생성을 지원할 수 있습니다.

+0

물론. 불행하게도 '아니오'는 맞지 않습니다. 그것은 모두 동적 객체를 어떻게 작성 하느냐에 달려 있습니다. 내 대답보기 –

+0

예. 그러나 나는 OP가 동적 인 객체의 멤버를 반복하는 범용적인 방법을 찾고 있다고 생각한다. –

+0

그렇다면 잘못된 것입니다. 죄송합니다 downvote : ( –

0

익숙하지 않은 익명 형식을 동적 개체로 반환하는 것으로 보입니다. 잠깐 살펴본 후 Dapper Dot Net에 익숙하지 않습니다. POCO (평범한 오래된 CLR 개체)로 볼 수 있습니다. 즉, 개별 명명 된 속성을 가진 클래스이고 인덱스로 필드에 액세스하는 데 필요한 인덱서를 구현하지 않았을 수 있습니다.

당신은 유사한 무언가를 달성하기 위해 반사를 사용하여 시도 할 수 :

foreach (dynamic propInfo in row.GetType().GetProperties()) 
{ 
    Console.WriteLine("{0}: {1}", propInfo.Name, propInfo.GetValue(row, null)); 
} 

난 당신이하지만, 저장 프로 시저를 반환 같은 순서로 속성을 얻을 것이다 모르겠어요.

+1

귀하의 예제에서'row.GetType()'null을 반환합니다. –

관련 문제