2013-03-09 2 views
0
매개 변수로 객체 응답을 가진 DoSomeService 함수가 있습니다. 응답이 다른 클래스 인 경우 내부 코드가 런타임에 동적으로 사용할 코드를 결정합니다.

런타임시 동적으로 일반 유형 T를 정의하십시오.

2. 나는 응답 클래스 유형을 취하는 일반 유창 검사기 < T>를 가지고 있습니다. 나는 많은 응답이 특히

public override void DoSomeService(object response) { 
    object validator = null; 
    if (response.GetType()==typeof(TypeA_Response)) validator= new Validator<TypeA_Response>(); 
    if (response.GetType()==typeof(TypeB_Response)) validator= new Validator<TypeB_Response>(); 
    if (response.GetType()==typeof(TypeC_Response)) validator= new Validator<TypeC_Response>(); 
    //...... 
    if (response.GetType()==typeof(TypeX_Response)) validator= new Validator<TypeX_Response>(); 
     if (validator.IsValid) { 
     //do more stuff ... 
    } 
} 

을하지만 그 좋은되지 않습니다 :

지금, 나는 하나씩 유형 검사를 할 수 있습니다. 나는 짧고 일반적인 것을 원한다.

//response could be TypeA_Response, TypeB_Response, TypeX_Response 
public override void DoSomeService(object response) { 
    var validator = new Validator<T>(); 
    if (validator.IsValid) { 
     //do more stuff ... 
    } 
} 

Fluent Validator에 T를 정의해야하므로 물론 작동하지 않습니다. 어떤 유형이 "객체 응답"인지를 감지하고 그것을 런타임에 동적으로 T로 채우려면 어떻게해야합니까?

또는이 모든 것을 함께 피하고 더 나은 구조의 유효성 검사기 < T>를 사용하려면 어떻게해야합니까?

참고 : 기본 서비스 클래스와 DoSomeService 함수 서명을 변경할 수 없습니다. 타사 패키지의 재정의 기능입니다.

+0

당신이 인터페이스, IValidator를 사용할 수 DoSomething 방법 내에서 제네릭이 아닌 형식을 사용하고 IValidator의 각 구현은이 있는지 확인해야합니다 해당 형식에 대한 자체 유효성 검사를 캡슐화하는 Validate() 메서드? 이것은 미지의 제네릭에 대한 필요성을 줄여 줄 것이라고 생각합니다. –

답변

2

는 가장 좋은 방법은 당신이 아직 모르기 때문에이 상황에서 Validator<T>을 사용할 수 없습니다하지만 심지어이 솔루션으로 반사에게

void DoSomething(object response) 
{ 
    var type = typeof(Validator<>); 
    var boundType = type.MakeGenericType(response.GetType()); 
    var validator = Activator.CreateInstance(boundType); 
} 

을 사용하는 것입니다 무엇 T입니다. 이 방법으로 사용하려면 T을 정적으로 정의해야합니다. 당신은 제네릭과 제네릭이 아닌 기본 유형에 Validator<T>을 깨고

Validator valdiator = Activator.CreateInstance(boundType); 
1

실제로 제네릭이 필요한 것은 아닙니다. 오히려 유효성 검사를 수행하는 가상 메서드가있는 기본 클래스가 있거나 구체적인 형식이 유효성 검사 메서드가있는 특정 인터페이스를 구현해야한다는 요구 사항이 있습니다. 당신이 진정이 동적하려면

+0

질문을 단순화했습니다. 실제 코드는 실제로 Windsor 메서드 선택기의 ValidationAspect 인터셉터에 있습니다. 인터셉터를 통해 어떤 방법이 왔는지에 상관없이 같은 질문이 적용됩니다. 일반화하려고합니다. 위의 그림과 같이 if 문을 실행하고 싶지 않습니다. – Tom

관련 문제