2010-01-08 2 views
25

ref 인수를 사용하는 정적 메서드의 대리자를 만들려고합니다. 왜 내가이 같은 교활한 일을하는지 묻지 말아라. 그것은 닷넷, C# 및 리플렉션이 어떻게 작동하는지 그리고 어떻게 최적화 하는지를 배우는데 모두 포함됩니다.액션의 대표자 < ref T1, T2>

내 코드는 다음과 같습니다

public struct DataRow 
    { 

     private double t; 
     static public void Cram_T(ref DataRow dr, double a_t) 
     { 
      dr.t = a_t; 
     } 
    } 
'''' 
    Type myType = typeof(DataRow); 
    MethodInfo my_Cram_T_Method = myType.GetMethod("Cram_T"); 
    var myCram_T_Delegate = 
     Delegate.CreateDelegate(typeof(Action<DataRow, Double>),  
           my_Cram_T_Method) 
           as Action<DataRow, Double>; 

(내 생각) 때문에 나에게 방법과 일치하지 않는 일반 조치를 바인딩 오류가 있습니다.

var myCram_T_Delegate = 
     Delegate.CreateDelegate(typeof(Action<ref DataRow, Double>),   
           my_Cram_T_Method) 
           as Action<ref DataRow, Double>; 

을하지만 이것은 컴파일되지 않습니다 : 시계 창에 Cram_T_Method의 값을 검사

나는 다음 작업에서 심판 키워드를 사용하여 시도

{Void Cram_T(DataRow ByRef, Double)} 

제공합니다. C# 컴파일러는 토큰 "ref"에서 질식합니다.

이 대리인을 만드는 올바른 방법은 무엇입니까?

답변

33

은 자신의 대리자 형식을 만듭니다

delegate void MyAction(ref DataRow dataRow, double doubleValue); 

그리고 Action<ref DataRow, Double> 대신에 MyAction을 사용 - 당신이 언급 한대로, 컴파일되지 않습니다. 당신이 더 일반적인 만들 수 있지만

+0

내부 방법에 제한을 제공합니다 :

Type refInt = typeof(int).MakeByRefType(); Type refIntList = typeof(List<>).MakeGenericType(refInt); 

오류 예외 : 난 그냥 그것을 시도했습니다 에스. – Bitterblue

21

@ 벤 M은, 올바른 생각을 가지고

public delegate void RefAction<T1, T2>(ref T1 arg1, T2 arg2) 

문제는 다음과 같은 대표와는 아무 상관이 없다 - 당신이 지정할 때 ref을 사용할 수 없습니다 단지 형식 인수.

이론적으로 "it 's ref 또는 not는"형식 정보 (따라서 Type.IsByRef)의 일부이지만 이론적으로 지정할 수는 없습니다.

솔직히 아니에요 전혀 당신이 반사를 통해 List<ref int>을 만들려고하는 경우, 예를 들어, 무슨 일이 일어날 지 확인 - 나는 예외가 던져 질 것이다 희망이 ... 그것은 매우 합리적인 개념이 아니다 것입니다 :)

편집 :

Unhandled Exception: System.ArgumentException: The type 'System.Int32&' may 
not be used as a type argument. 
+4

유형 인수는 값이 객체로 변환 가능한 유형이어야합니다. 관리되는 포인터 유형과 관리되지 않는 포인터 유형이 해당 요구 사항을 충족하지 못합니다. –

+1

글쎄, 나는 결코. 매혹적인. 한 번만, 나는 C#에서 이것을 깊이 포함하는 것이 가치 있다고 생각하지 않습니다. 어쩌면 메모로 ... –

+0

이것은 작동하지만 목록 주석은 부적절합니다. 공개 대리자 void RefGenAction (ref T1 arg1, T2 arg2); RefGenAction 으로 var myCram_TDelegate = Delegate.CreateDelegate (typeof (RefGenAction ), myType.GetMethod ("Cram_T")); –