고려해야 할 몇 가지 시나리오가 있습니다. 우선, 객체의 유형을 확인해야합니다. 이를 위해 간단히 GetType ()을 호출 할 수 있습니다. 유형이 IDynamicMetaObjectProvider를 구현하지 않으면 다른 객체와 동일한 리플렉션을 사용할 수 있습니다. 다음과 같은 것 :
var propertyInfo = test.GetType().GetProperties();
그러나 IDynamicMetaObjectProvider 구현의 경우 단순 리플렉션이 작동하지 않습니다. 기본적으로이 객체에 대해 더 알아야합니다. 그것이 ExpandoObject (IDynamicMetaObjectProvider 구현 중 하나) 인 경우 itowlson이 제공 한 답변을 사용할 수 있습니다. ExpandoObject는 속성을 사전에 저장하고 동적 객체를 사전에 캐스트 할 수 있습니다.
DynamicObject (다른 IDynamicMetaObjectProvider 구현) 인 경우이 DynamicObject가 노출하는 모든 방법을 사용해야합니다. DynamicObject는 실제로 속성 목록을 어디에나 "저장"할 필요가 없습니다. 예를 들어 다음과 같은 작업을 수행 할 수 있습니다 ( 블로그 게시물 의 예를 재사용하고 있음 ).
public class SampleObject : DynamicObject
{
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = binder.Name;
return true;
}
}
이 경우 지정된 이름으로 속성에 액세스하려고 할 때마다 개체는 속성 이름을 문자열로 반환합니다.
dynamic obj = new SampleObject();
Console.WriteLine(obj.SampleProperty);
//Prints "SampleProperty".
따라서 반영 할 항목이 없습니다.이 개체에는 속성이 없으며 동시에 모든 유효한 속성 이름이 작동합니다.
IDynamicMetaObjectProvider 구현의 경우 ExpandoObject와 같은 속성 목록을 가져오고 나머지 부분은 무시하거나 예외를 throw 할 수있는 알려진 구현을 필터링해야합니다.