런타임시 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
매개 변수를 사용하여 대리자를 작성하려면 어떻게해야합니까?
고마워, 작동 :) – MillKa
음, 거의 작동합니다. GetDelegateType은 필요한 유형을 만듭니다. 그래서 Ani는 내 질문에 완전히 대답했습니다. 그러나 나는 여전히 대의원에게 전화하는 데 몇 가지 문제가있다. 그러나 나는 아직도 어떤 일이 일어나고 있는지 분석 중이다. GetDelegateType의 예기치 않은 동작을 감지했습니다. 정확하게 동일한 매개 변수로 여러 번 호출되면 각 호출은 새로운 유형 인스턴스를 반환하므로 참조 평등하지 않습니다. 여기에 더 많은 정보가 있습니다 : [DLR @ CodePlex - Expression.GetDelegateType과 사용자 정의 struct with ref] 버그 (http://dlr.codeplex.com/discussions/209768). 나는 무엇을 묻는 지 알 때 돌아 올 것이다. – MillKa
나는 내 문제를 지금 이해하고 있다고 생각한다. 표현식 트리를 구축하는 함수에서'Expression.GetDelegateType()'을 사용하여 델리게이트 유형을 지정합니다. 그러나 컴파일 된 델리게이트를'VoidDelSRef'로 캐스팅 할 수 없습니다. 각 GetDelegateType이 새로운 유형 인스턴스를 반환하기 때문일 가능성이 큽니다. 그래서 저는 위임장 dlg를 이렇게 부릅니다 :'S s = new S(); var dpl = 새로운 객체 [] {s}; dlg.DynamicInvoke (dpl); s = (S) dpl [0];'. 다소 효율적이지는 않겠지 만 지금은 효과가 있습니다 :) – MillKa