2013-10-01 13 views
5

Xin chào Tôi đang cố gắng tạo một sứ giả trong Mono 2.8.2 - tập hợp con được Unity3d sử dụng. Tôi nghĩ rằng nó sẽ là tiện lợi để tạo ra một người trợ giúp để tự động đăng ký các phương pháp để messenger khi họ được trang trí với một "đăng ký" thuộc tính.Tạo một đại biểu từ phương thứcInfo trong Mono 2.8.2

Tôi đã gãi đầu về vấn đề này và đã đọc nhiều câu hỏi liên quan đến chồng khác mà không có giải pháp cho vấn đề của tôi. Frankly, I don't know if I am doing something wrong or if this is a bug in Mono.

foreach (var methodInfo in methods) 
     { 
      var attr = methodInfo.GetAttribute<SubscribeAttribute>(); 
      if (attr == null) 
       continue; 

      var parmas = methodInfo.GetParameters(); 
      if (parmas.Length != 1) 
      { 
       Debug.LogError("Subscription aborted. Invalid paramters."); 
       continue; 
      } 

      var type = parmas[0].ParameterType; 

      // Crashes here 
      // ArgumentException: method argument length mismatch 
      // I have tried many combinations.. 
      // Direct typing of the message type and dynamic typing 

      var action = (Action<object>)Delegate.CreateDelegate(typeof(Action<object>), methodInfo); 

      // also does not work 
      // var dt = Expression.GetActionType(parmas.Select(o => o.ParameterType).ToArray()); 
      // var action = Delegate.CreateDelegate(dt, methodInfo); 

      Subscribe(type, action, instance); 
     } 

Mọi đề xuất hoặc công việc xung quanh sẽ được đánh giá cao.

Sửa Chữ ký phương pháp trông giống như:

[Subscribe] 
void OnMessage(object message){ 
    // Hello World 
} 

Mặc dù, nó đã được ban ...

[Subscribe] 
void OnTestMessage(TestMessage message){ 
    // Hello World 
} 
+0

Chữ ký của phương pháp bạn đang cố đăng ký là gì? Nó có một chữ ký như 'void MyMethod (đối tượng arg)'? –

+0

Chính xác. Tôi đã cập nhật bài đăng. – user2085865

+1

mono 2.8 cực kỳ cũ, vui lòng nâng cấp lên 3.2.3 – knocte

Trả lời

6

Đó là một phương pháp không tĩnh và bạn không cung cấp một mục tiêu vật. Do đó, Delegate.CreateDelegate sẽ tạo "đại biểu mở" với đối số rõ ràng this.

Do yêu cầu đối số this, nó không còn khớp với chữ ký.

+0

Tôi nhận được bản thân mình vết thương lên một vấn đề và bỏ lỡ rõ ràng. Tôi cần học cách tách cà phê ra và chơi với con mèo của mình. – user2085865

+1

Đã lâu rồi nhưng câu trả lời này thực sự hữu ích. '(Hành động ) Delegate.CreateDelegate (typeof (Hành động ), ** this **, methodInfo);' sẽ làm cho nó đúng. –

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