2016-06-27 3 views
1

값을 얻고 설정하기 위해받는 클래스의 PropertyInfo에 의존하는 반사 작업을 수행하는 라이브러리가 있습니다.동적 객체의 PropertyInfo 가져 오기

이제 동적 객체로 작업 할 수 있기를 원하지만 동적 속성의 PropertyInfo를 얻는 방법을 찾을 수 없습니다. 나는 대체물을 체크했으나, PropertyInfo를 사용하여 값을 얻거나 설정하기 위해 어디에서든지 변경해야 할 필요가있다.

dynamic entity = new ExpandoObject(); 
entity.MyID = 1; 

// - Always null 
PropertyInfo p = entity.GetType().GetProperty("MyID"); 
// - Always null 
PropertyInfo[] ps = entity.GetType().GetProperties(); 

// - These are called everywhere in the code 
object value = p.GetValue(entity); 
p.SetValue(entity, value); 

는 그냥 동적 객체에이 GetValue()SetValue()의 사용할 수 있도록 얻거나 어떻게 든 PropertyInfo을 만들 수 있습니까?

+1

나는 이것을 재현 할 수 없다. 'MyID'속성이 해당 엔터티에 존재하며 공개 된 것은 확실합니까? –

+0

@DavidL 죄송합니다, 더 좋은 예를 게시하겠습니다. 그것은 역동적이어서 속성은 설정되고 공개 된 경우에만 존재합니다. – Danicco

+0

실제 속성이 아닐 수도 있습니다. 런타임 바인딩을 이름/값 사전으로 리디렉션하여 'ExpandoObject' _simulate_ properties와 같은 일부 유형. –

답변

0

표지 아래 ExpandoObject은 실제로는 사전입니다. 그냥 캐스팅하여 사전에 올 수 있습니다.

dynamic entity = new ExpandoObject(); 
entity.MyID = 1; 

if(entity.GetType() == typeof(ExpandoObject)) 
{ 
    Console.WriteLine("I'm dynamic, use the dictionary"); 
    var dictionary = (IDictionary<string, object>)entity; 
} 
else 
{ 
    Console.WriteLine("Not dynamic, use reflection"); 
} 

당신은 객체가 전달되고 있는지 확인하기 위해 Mapping 방법을 수정할 수는 다른 경로를 통해 동적 경로입니다 사전의 키 이상 단지 반복합니다.

https://dotnetfiddle.net/VQQZdy

+0

나는 피하려고합니다. 사전은'PropertyInfo'를 가정하는 코드에서 모든 부분을 변경해야하기 때문에 캐스팅되었습니다. – Danicco