2011-04-06 6 views
2

런타임시 ref 매개 변수를 사용하여 대리자 형식을 만들어야합니다. 내가 컴파일시 매개 변수 유형 (들)을 알았다면런타임에 ref 매개 변수로 C# 대리자 형식을 만듭니다.

, 내가 예를 들어 명시 적 대리자 형식 선언을 사용할 수 있습니다

유형 td는 C# 4 식 트리를 만드는 데 사용되는
// S is some struct/value type, e.g. int or Guid 
delegate void VoidDelSRef (ref S s); 
Type td = typeof (VoidDelSRef); 

, 델리게이트로 컴파일됩니다.

내 표현 트리의 코드가 s 매개 변수를 수정하므로 참조로 s을 전달해야합니다.

나는 모든 종류의 S를 지원하기 위해, 그래서 난 단지 Type ts = typeof (S)하고 ref 유형 Type tsr = ts.MakeByRefType()이 때문에, 명시 적 대리자 형식 선언을 사용할 수 없습니다.

Expression.GetActionType (tsr)을 사용해 보았지만 ref 유형을 사용할 수 없습니다.

런타임시 ref 매개 변수를 사용하여 대리자를 작성하려면 어떻게해야합니까?

답변

2

.NET 4에서는 Expression.GetDelegateType 메서드를 사용할 수 있습니다. GetActionType과 달리 ByRef 유형에서는 정상적으로 작동합니다.

예컨대 : 당신이 .NET 3.5에있는 경우

// void MyDelegate(ref int arg) 
var delType = Expression.GetDelegateType(typeof(int).MakeByRefType(), 
             typeof(void)); 

,이 방법은 사용할 수 없습니다. 기능을 복제하려는 경우 디 컴파일러를 사용하여 구현을 살펴 보는 것이 좋습니다. 의존성이 너무 많지 않습니다. 그것은 확실히 할 수 있습니다.

+0

고마워, 작동 :) – MillKa

+0

음, 거의 작동합니다. GetDelegateType은 필요한 유형을 만듭니다. 그래서 Ani는 내 질문에 완전히 대답했습니다. 그러나 나는 여전히 대의원에게 전화하는 데 몇 가지 문제가있다. 그러나 나는 아직도 어떤 일이 일어나고 있는지 분석 중이다. GetDelegateType의 예기치 않은 동작을 감지했습니다. 정확하게 동일한 매개 변수로 여러 번 호출되면 각 호출은 새로운 유형 인스턴스를 반환하므로 참조 평등하지 않습니다. 여기에 더 많은 정보가 있습니다 : [DLR @ CodePlex - Expression.GetDelegateType과 사용자 정의 struct with ref] 버그 (http://dlr.codeplex.com/discussions/209768). 나는 무엇을 묻는 지 알 때 돌아 올 것이다. – MillKa

+0

나는 내 문제를 지금 이해하고 있다고 생각한다. 표현식 트리를 구축하는 함수에서'Expression.GetDelegateType()'을 사용하여 델리게이트 유형을 지정합니다. 그러나 컴파일 된 델리게이트를'VoidDelSRef'로 캐스팅 할 수 없습니다. 각 GetDelegateType이 새로운 유형 인스턴스를 반환하기 때문일 가능성이 큽니다. 그래서 저는 위임장 dlg를 이렇게 부릅니다 :'S s = new S(); var dpl = 새로운 객체 [] {s}; dlg.DynamicInvoke (dpl); s = (S) dpl [0];'. 다소 효율적이지는 않겠지 만 지금은 효과가 있습니다 :) – MillKa

관련 문제