2011-03-09 6 views
2

제네릭을 도입하여 일부 코드를 리팩토링하려고하는데 막혔습니다. 나는 T의 새로운 인스턴스를 만들려고하는데 문제는 T가 생성자에 델리게이트 인수를 가지고 있다는 것이다. 단지 [객체] 유형이 [액티베이터]의 인수로 사용할 수 있습니다로,대리자를 사용하여 일반 인스턴스 만들기

public delegate IOrders DoStuffDelegate(); 


public class GenericBoss<T> where T:Worker 
{ 

    public void DelegateWork() 
    { 
     T worker = Activator.CreateInstance(typeof(T), new[]{GiveOrders}) 
     worker.Work(); 
    } 

    public IOrders GiveOrders() 
    { 
     return new OrderFromTheBoss(); 
    } 
} 

public class Worker 
{ 
    private readonly DoStuffDelegate _takeOrders; 

    public Worker(DoStuffDelegate takeOrders) 
    { 
     _takeOrders = takeOrders; 
    } 

    public void Work() 
    { 
     _takeOrders(); 
    } 
} 

그러나이 작동하지 않습니다 내가 무엇을 목표로 한 것은이 같은했다. 나는 생성자를 변경할 수 없기 때문에 대리자를 다른 곳으로 옮길 수는 없다.

탈출구가 있습니까? 아니면 제네릭이 옵션이 아닙니까?

안부, 모르 텐

답변

3

문제는 컴파일러는 당신이 당신의 방법 그룹에 변환 할 위임을 알고하지 않습니다. 항상DoStuffDelegate있다면, 당신은이 작업을 수행 할 수 있습니다

object[] args = new object[] { new DoStuffDelegate(GiveOrders) }; 
T worker = (T) Activator.CreateInstance(typeof(T), args); 

또는

DoStuffDelegate giveOrders = GiveOrders; 
object[] args = new object[] { giveOrders }; 
T worker = (T) Activator.CreateInstance(typeof(T), args); 

대리자 형식이 각 T 다른 경우

, 그것은 어렵습니다 - 당신은 아마 Delegate.CreateDelegate를 호출 할 필요 했어 (

+0

'Activator.CreateInstance'가이 경우 객체를 반환한다고 생각하십니까? 'as'형 또는 일반형이 있어야합니다. 적용됨. –

+0

@ 대니 : 예, 캐스트가 필요할 것입니다. 추가 할 것입니다. 나는 OP의 원래 문제라고 생각하는 것들에 대한 논쟁 측면에 초점을 맞추고있었습니다 :) –

+0

예, T로 다시 캐스팅해야했지만 그 때 그것은 작동했다. 고맙습니다. 방금 내 코드를 훨씬 더 예쁘게 만들었습니다. o) – Morten

관련 문제