2013-07-23 6 views
5

그래서 나는 T와 Nullable을 모두 처리하는 사용자 지정 제네릭 모델 바인더가 있습니다 <T>.
하지만 리플렉션을 통해 자동으로 bindig를 만듭니다. 나는 특정 속성과 플래그 열거 형에 대한 전체 AppDomain을 trhough 검색 및 I는 다음과 같이 열거를 theese 바인딩 할 :Wrap T in Nullable <T> 반사를 통해

AppDomain 
    .CurrentDomain 
    .GetAssemblies() 
    .SelectMany(asm => asm.GetTypes()) 
    .Where(
     t => 
     t.IsEnum && 
     t.IsDefined(commandAttributeType, true) && 
     !ModelBinders.Binders.ContainsKey(t)) 
    .ToList() 
    .ForEach(t => 
    { 
     ModelBinders.Binders.Add(t, new CommandModelBinder(t)); 
     //the nullable version should go here 
    }); 

을 그러나 여기 캐치입니다. Nullable <T>을 CommandModelBinder에 바인딩 할 수 없습니다.
나는 런타임 코드 생성을 생각하고있다. 그러나 나는 이것을 결코하지 않으며 아마도 시장에 다른 옵션이있을 것이다. 이것을 달성하기위한 아이디어가 있습니까?

감사합니다,
페테르

답변

8

당신이 T을 가지고 있다면, 당신은 Type.MakeGenericType를 사용 Nullable<T>을 만들 수 있습니다

ModelBinders.Binders.Add(t, new CommandModelBinder(t)); 
var n = typeof(Nullable<>).MakeGenericType(t); 
ModelBinders.Binders.Add(n, new CommandModelBinder(n)); 

나는 방법 CommandModelBinder 작품을 알고 적절한 생성자 인자가 무엇인지하지 않습니다 대신

ModelBinders.Binders.Add(n, new CommandModelBinder(t)); 

이 필요할 수 있습니다.

참고 : MakeGenericType은 잘못된 유형으로 호출 된 경우 예외를 throw합니다. 오류 검사를 추가하지 않았습니다. 이미이 유형이 의미있는 형식 만 얻도록 필터링하고 있기 때문입니다. 필터링을 변경하면이 점을 명심하십시오.

+0

대답에 대해 감사 드리며 필터링에 대해 알려주세요. 나는 그것이 코드화 된 것처럼 행동한다고 ​​가정한다. 그러므로 제한적인 것이 있거나 generic 매개 변수의 정확한 숫자를 전달하지 않으면 예외를 던질 것이다. –