Sau khi googling và hạ cánh trên SO và có đọc this other questionXây dựng một đại biểu từ MethodInfo?
Có thể xây dựng một Đại biểu đúng từ một MethodInfo nếu THỂ BẠN CHƯA BIẾT số điện thoại hoặc các loại thông số tại thời gian biên dịch?
Thông tin thêm về điều này: điều này có thể được thực hiện một cách thanh lịch mà không cần sử dụng Reflection.Emit hoặc type builders?
Đây là một điều tốt cho tôi vì Delegate.CreateDelegate yêu cầu tôi chỉ định đúng loại đại biểu làm tham số đầu tiên hoặc nếu không nó sẽ ném ngoại lệ hoặc gọi phương thức không chính xác.
Tôi đang xây dựng một số bánh răng ninja và điều này sẽ giúp rất nhiều ... Cảm ơn!
Dưới đây là một giải pháp chung:
/// <summary>
/// Builds a Delegate instance from the supplied MethodInfo object and a target to invoke against.
/// </summary>
public static Delegate ToDelegate(MethodInfo mi, object target)
{
if (mi == null) throw new ArgumentNullException("mi");
Type delegateType;
var typeArgs = mi.GetParameters()
.Select(p => p.ParameterType)
.ToList();
// builds a delegate type
if (mi.ReturnType == typeof(void)) {
delegateType = Expression.GetActionType(typeArgs.ToArray());
} else {
typeArgs.Add(mi.ReturnType);
delegateType = Expression.GetFuncType(typeArgs.ToArray());
}
// creates a binded delegate if target is supplied
var result = (target == null)
? Delegate.CreateDelegate(delegateType, mi)
: Delegate.CreateDelegate(delegateType, target, mi);
return result;
}
Note: Tôi đang xây dựng một ứng dụng Silverlight rằng sẽ thay thế một ứng dụng javascript xây dựng năm-trước trong đó tôi có nhiều Các giao diện Javascript gọi vào cùng một phương thức Silverlight [ScriptableMember].
Tất cả các giao diện JS cũ cần được hỗ trợ cũng như giao diện mới để truy cập các tính năng mới, vì vậy một thứ tự động thiết lập giao diện JS và "đại biểu" cuộc gọi đến phương pháp Silverlight phù hợp sẽ giúp tăng tốc công việc.
Tôi không thể đăng mã ở đây, vì vậy đó là tóm tắt.
Tôi đang xây dựng điều này để gắn kết với nhau Silverlight [ScriptableMember] và một giao diện Javascript riêng biệt vì vậy tôi không phải lo lắng về việc giữ chữ ký phương thức đồng bộ ở cả hai vị trí. – chakrit
Wow .... đã giúp ích rất nhiều! Các bạn rock! – chakrit
@ Marc Gravell, tôi không thể gọi đại biểu được tạo trong mã ở trên như d(). Sau khi googling tôi thấy rằng dynamicInvoke có thể được sử dụng để gọi phương thức, mà là rất chậm. xin giúp đỡ. tôi mới đến đại biểu và sự kiện. yêu cầu của tôi là gọi phương thức động, số hoặc loại tham số sẽ được biết khi chạy chỉ – Saranya