2013-09-03 1 views
1

문제의 일부가 HTML 양식에서 일련의 데이터베이스 기반의 비교적 복잡한 Entity Framework DbSets로 모델 바인딩되는 복잡한 솔루션이 있습니다.Impromptu-Interface를 사용하여 속성 유형 얻기

우리가 캡처하는 데이터에 대해 알아야 할 모든 것을 캡슐화 한 EF 정의 도메인 모델이 있습니다. 그러나 프로젝트의 관리자는 설문지와 같은 형식을 만들어서이 도메인의 구성원 중 하나를 선택할 수 있기를 원합니다.

어쨌든, 그것은 크게 작동하므로, 최소한 단순한 멤버, 문자열, 날짜, bool 등에 대해서는 아주 잘 작동합니다. 까다로운 부분은 Address 개체와 같이 여러 필드가있는 멤버를 관리하는 것이 었습니다.

솔루션은 리플렉션을 사용하여 양식 게시물에서 수신 한 도메인의 값을 설정했지만 그 오버 헤드가 있으며 나는 을 더 멋지게 찾을 수 있습니다. 일을하는 방식; 필자의 연구에서는 리플렉션 (Reflection)보다 많은 속도 향상을 약속 한 'Impromptu 인터페이스'프로젝트에 대해 알았지 만 간단한 문제가 하나 있습니다.

그것은 잘 좋은 취득하고 속성 설정하는 것 :

var val = Impromptu.InvokeGet(domain, "fieldName"); 
Impromptu.InvokeSet(domain, "fieldName", value); 

을하지만, 내가 뭘해야 속성의 유형을 찾는 것입니다. 지금까지 여전히 해당 리플렉션하는 방법을 볼 수 있습니다

PropertyInfo pi = domain.GetType().GetProperty("Name", BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance); 
if (pi.GetValue(domain) is IMyInterface) 
{ 
    // ? profit 
} 

를 따라서 : 그것은 즉석으로이 작업을 수행 할 수 있습니까? html 양식 게시물을 내 EF 개체로 변환하는 멤버가 있으므로이 인터페이스로 속성을 캐스팅해야합니다.

답변

1

당신이 묻는 일반적인 질문은 ImpromptuInterface를 사용하여 속성 유형을 쿼리 할 수 ​​있습니까? 대답은 아니오입니다. DLR에는 함수가 없습니다. 반성입니다.

그러나 리플렉션을 사용하여 제공하는 예제는 속성 유형을 테스트하지 않고 값의 런타임 유형을 테스트하므로 리플렉션 없이도 즉석에서 작동합니다.

var val = Impromptu.InvokeGet(domain, "fieldName"); 
if(val is IMyInterface){ 
    // ? profit 
} 

또한 속성을 보려면 FastMember을 참조하십시오. 객체 유형에 따라 가장 빠른 액세스 메커니즘을 선택합니다.

+0

내가 어디로가는 지 보지 만, FastMember 프로젝트에 대해 +1 할 자격이있어, 여기에서 일부 코드를 상당히 단순화 할 수 있습니다! –

+0

안녕하세요, 불행히도 InvokeGet이 제대로 작동하지 않습니다. 기본 속성이 인스턴스화 된 경우에는 문제가 없지만 null이면 위의 코드에서 val도 null이됩니다. –

+0

예전에 말했듯이 dlr에는 아무 것도 없습니다. 'typeof (IMyInterface) .IsAssignableFrom (domain.GetType(). GetProperty ("Name", BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance). PropertyType)' – jbtule