2009-09-28 3 views
0

길게 : TasksHandlers이되는 시스템에서 작업하고 있습니다. 작업은 시스템의 다른 부분에서 처리기로 보내지며 결국 처리기가 값을 반환합니다.C# Generics - 일반 메서드 사용에서 일반 형식 결정

우리는 느슨한 유형의 시스템을 가지고 있으며 험악한 혼란으로 변했습니다. (문제는 작업 개시자가 종종 제 3 자 구성 요소에서 발생한다는 사실에 의해 크게 증폭됩니다. 본질적으로 플러그인 임).

나는 강하게 입력 된 방식으로이를 구현하는 방법을 생각해 왔으며, 단지 이것을 obsurdity의 요점으로 생각할 수도 있지만, 과 비슷합니다. 문제는 몇 가지 구문입니다. 당신이 볼 수 있듯이 ITask 제네릭,

interface ITask<ReturnType> { } 

interface ITaskHandler<TaskType, TaskReturnType> where TaskType : ITask<TaskReturnType> 
{ 
    TaskReturnType PerformTask(TaskType task); 
} 

ITask에 대한 선언 일반 매개 변수는 ITaskHandler<ITask>의 리턴 타입 :

는 여기에 내가 (명확성을 위해 확장 일반적인 이름)를 가지고거야. 즉, 각 TaskHandler은 계약 상으로는 ITask으로 지정된 유형을 반환하도록 바인딩됩니다. TaskHandlers를 선언하는 것은 일부 매우 추한 서명에 이르게

큰 단점 ...

class SpecificTask : ITask<Dictionary<Type,Delegate>> 
{ 
} 

class SpecificHandler : ITaskHandler<SpecificTask, Dictionary<Type, Delegate>> 
{ 
    public Dictionary<Type, Delegate> PerformTask(SpecificTask task) 
    { 
     return new Dictionary<Type, Delegate>(); 
    } 
} 

내 질문은 : SpecificTask은 이미 일반적인 매개 변수로 returnType이있어 제공하고 있기 때문에, SpecificHandler의 서명이 단축 될 수있다 이상과 같은 :

interface ITaskHandler<TaskType> where TaskType : ITask 
{ 
    // pulling TaskReturnType out of thin air... 
    TaskReturnType PerformTask(TaskType task); 
} 

class SpecificHandler : ITaskHandler<SpecificTask> 
{ 
    public Dictionary<Type, Delegate> PerformTask(SpecificTask task) 
    { 
     return new Dictionary<Type, Delegate>(); 
    } 
} 

... 그리고, 어떻게 유형이 SpecificTask에 포함되어 PerformTask의 반환 유형을 선언 할 그렇다면?

답변

0

불행히도 당신이하고 싶은 일을 할 수없고 정적 유형 검사를 유지할 수 없습니다. 컴파일러가 어디로 가는지 정적으로 알 수 있으려면 모든 제네릭 형식 매개 변수를 파기해야합니다.

리플렉션을 사용하면이 작업을 수행 할 수 있지만 처음에는 제네릭의 목적을 완전히 손상시킬 수 있습니다.

+0

아마도 두려워 할 수도 있습니다 ... 제가 인식하지 못했던 몇 가지 구문일지도 모르기를 바랬습니다. – STW