2010-01-08 26 views
25

Tôi đang cố gắng tạo một đại biểu của một phương pháp tĩnh có tham số ref. Xin đừng hỏi tại sao tôi lại làm điều như vậy. Đó là một phần của việc học cách .Net, C#, và công việc phản chiếu và cách tối ưu hóa nó.Ủy quyền cho một hành động < ref T1, T2>

Mã của tôi là:

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>; 

này mang lại cho tôi một lỗi ràng buộc bởi vì (tôi nghĩ) hành động chung không phù hợp với phương pháp này.

Kiểm tra giá trị của Cram_T_Method trong cửa sổ xem cho

{Void Cram_T(DataRow ByRef, Double)} 

sau đó tôi đã cố gắng sử dụng từ khóa ref trong hành động:

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

Nhưng điều này sẽ không biên dịch. Trình biên dịch C# chokes tại dấu "ref".

Cách đúng để tạo đại biểu này là gì?

Trả lời

33

Tạo kiểu đại biểu của riêng bạn:

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

Và sử dụng MyAction ở vị trí của Action<ref DataRow, Double> - mà, như bạn đã lưu ý, không biên dịch.

+0

đó mang lại hạn chế đối với phương pháp nội S. – Bitterblue

21

@Ben M có ý tưởng đúng, mặc dù bạn có thể làm cho nó chung chung hơn:

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

Vấn đề không có gì để làm với các đại biểu như vậy - nó chỉ là bạn không thể sử dụng ref khi bạn chỉ định một đối số kiểu.

Theo lý thuyết thì "theo ref hay không" là một phần của thông tin loại (do đó Type.IsByRef) nhưng bạn không thể chỉ định nó như thế.

Thành thật mà nói, tôi không chắc chắn điều gì sẽ xảy ra nếu bạn cố gắng tạo ra một hình ảnh List<ref int> qua phản ánh - tôi sẽ hy vọng rằng một ngoại lệ sẽ bị ném ... không phải là khái niệm rất hợp lý :)

EDIT: tôi vừa mới thử nó:

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

Ném một lỗi:

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

Đối số loại phải là loại có giá trị được chuyển đổi thành đối tượng. Các kiểu con trỏ được quản lý và không được quản lý không đáp ứng yêu cầu đó. –

+1

Tôi chưa bao giờ. Hấp dẫn. Đối với một lần, tôi * không * nghĩ rằng nó sẽ có giá trị bao gồm cả trong C# trong chiều sâu. Có thể là một lưu ý ... –

+0

Tác phẩm này nhưng bình luận danh sách không liên quan. đại biểu công cộng void RefGenAction (ref T1 arg1, T2 arg2); var myCram_TDelegate = Delegate.CreateDelegate (typeof (RefGenAction ), myType.GetMethod ("Cram_T")) dưới dạng RefGenAction ; –

Các vấn đề liên quan