2009-07-30 28 views
5

Tôi có một cuốn từ điển đó là loại điển [chuỗi, handler_func] nơi
handler_func là một đại biểu của loạiC# đại biểu và các thuộc tính câu hỏi cú pháp

public delegate void HANDLER_FUNC(object obj, TcpClient client); 

bây giờ tôi có một lớp thuộc tính như vậy

[AttributeUsage(AttributeTargets.Method)] 
public class MessageHandlerAttribute : Attribute 
{ 

    public MessageHandlerAttribute(string s1, HANDLER_FUNC hf) 
    { 
     s1 = name; 
     msgtype = hf; 
    } 
    private string name; 
    public string HandlerName 
    { 
     get { return name; } 
     set { name = value; } 
    } 

    private HANDLER_FUNC msgtype; 
    public HANDLER_FUNC MessageName 
    { 
     get { return msgtype; } 
     set { msgtype = value; } 
    } 

} 

Ý tưởng cơ bản là tôi áp dụng thuộc tính này cho phương pháp trong lớp và ở đâu đó tôi sử dụng phản chiếu để điền vào từ điển ở trên

vấn đề là trừ khi phương pháp này là tĩnh atrribute không hoạt động nên

[MessageHandlerAttribute("HandleLoginResponse",HandleLoginResponse)] 
private void HandleLoginResponse(object obj, TcpClient client) 

đang gây ra tiêu chuẩn cần phải có điều đối tượng
Vì vậy, lựa chọn của tôi (là những gì tôi không muốn các phương pháp xử lý để được tĩnh) Cảm ơn

Trả lời

6
[MessageHandlerAttribute("HandleLoginResponse",HandleLoginResponse)] 
private void HandleLoginResponse(object obj, TcpClient client) 

Tôi không hiểu lý do tại sao bạn cần phải xác định phương pháp trong các thuộc tính: kể từ khi thuộc tính được áp dụng đối với phương pháp này, bạn đã có thể lấy phương pháp ... Bạn có thể làm điều gì đó như thế:

[MessageHandlerAttribute("HandleLoginResponse")] 
private void HandleLoginResponse(object obj, TcpClient client) 

... 

foreach(MethodInfo method in this.GetType().GetMethods()) 
{ 
    MessageHandlerAttribute attr = Attribute.GetCustomAttribute(method, typeof(MessageHandlerAttribute)) as MessageHandlerAttribute; 
    if (attr != null) 
    { 
     HANDLER_FUNC func = Delegate.CreateDelegate(typeof(HANDLER_FUNC), this, method) as HANDLER_FUNC; 
     handlers.Add(attr.HandlerName, func); 
    } 
} 
2

Tham số thuộc tính được tạo tại thời gian biên dịch và được lưu trữ trong assembly, vì vậy điều này sẽ không hoạt động (HandleLoginResponse là một phương pháp không tĩnh, vì vậy nó được ràng buộc với một đối tượng, chỉ có sẵn khi chạy)

2

Sử dụng đại biểu trên một thuộc tính là ... bất thường và có thể không được hỗ trợ.

Phương pháp thể hiện sẽ yêu cầu đối tượng, vì vậy bạn cần phải bao gồm đối tượng khi tạo đại biểu (tham số target đến Delegate.CreateDelegate qua phản chiếu) hoặc bạn sẽ cần sử dụng loại đại biểu thứ hai (không có mục tiêu trên đại biểu, nhưng bổ sung lấy mục tiêu là param0 - nó sẽ giải quyết mục tiêu này khi được sử dụng).

Tuy nhiên, tôi đoán một chút về những gì bạn đang cố gắng làm (nó không phải là 100% rõ ràng).

2

Đối số thuộc tính phải là biểu thức liên tục, biểu thức typeof hoặc biểu thức tạo mảng của loại tham số thuộc tính.

2

Tôi rất muốn xem ví dụ về cách làm việc này với phương pháp tĩnh, như bạn ngụ ý có thể có trong câu hỏi!

vấn đề là trừ khi phương pháp này là tĩnh atrribute không hoạt động ...

ví dụ giả sử HandleLoginResponse là tĩnh, điều gì sẽ xảy ra sau đó?

Tôi không nghĩ rằng nó sẽ tạo ra bất kỳ sự khác biệt nào. Bạn không thể thực hiện một ủy nhiệm const, vì vậy bạn không thể chuyển giao một đại biểu cho một thuộc tính.

2

Earwicker: thật không may, bạn nói đúng ... Nó cũng không hoạt động với các phương thức tĩnh.Bạn nhận được thông báo lỗi này:

CS0182

lỗi: Một cuộc tranh cãi thuộc tính phải là một biểu thức hằng số, typeof biểu hiện hoặc tạo mảng biểu hiện của một loại tham số thuộc tính

Những gì tôi đang cố gắng để làm là xác định một phương pháp nào đó mà sẽ được gọi khi một tài sản được thay đổi. Điều này sẽ là tốt để làm bằng cách sử dụng một đại biểu. Tôi đã có nó làm việc ngày hôm qua chỉ với một chuỗi, nhưng đó là một chút quá yếu ... bằng cách sử dụng một phương pháp tĩnh sẽ được tốt hơn, nhưng điều này có vẻ là không thể với phiên bản hiện tại của NET Framework (3.5, VS2008).

Quá tệ!

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