2009-07-30 17 views
5

मैं एक शब्दकोश के प्रकार शब्दकोश है जो [स्ट्रिंग, handler_func] जहां
handler_funcसी # प्रतिनिधि और विशेषताएँ वाक्य रचना सवाल

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

मैं इतना

की तरह एक विशेषता वर्ग है प्रकार का एक प्रतिनिधि है
[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; } 
    } 

} 

मूल विचार मैं एक कक्षा में एक विधि से इस विशेषता को लागू करते हैं और कहीं न कहीं मैं प्रतिबिंब का उपयोग

ऊपर शब्दकोश को भरने के लिए है जब तक इस पद्धति तो

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

खड़ी कर रहा है मानक एक वस्तु बात
तो क्या मेरे विकल्प (हैं मैं नहीं हैंडलर विधि स्थिर होना चाहता हूँ की जरूरत है स्थिर atrribute काम नहीं कर रहा है +५३६९१३६३२१०

समस्या है) धन्यवाद

उत्तर

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

मुझे समझ नहीं आता कि क्यों विशेषता में विधि निर्दिष्ट करना होगा: के बाद से विशेषता विधि करने के लिए लागू किया जाता है, आप पहले से ही विधि प्राप्त कर सकते हैं ... आप ऐसा ही कुछ कर सकता है:

[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

गुण मापदंडों संकलन समय पर उत्पन्न कर रहे हैं और विधानसभा में जमा हो जाती है, तो यह काम नहीं करेगा (HandleLoginResponse एक गैर स्थैतिक विधि है, तो यह एक वस्तु है, जो रनटाइम पर ही उपलब्ध है) के लिए बाध्य है

2

एक विशेषता पर एक प्रतिनिधि का उपयोग करना असामान्य है, और शायद समर्थन योग्य नहीं है।

एक उदाहरण विधि एक वस्तु की आवश्यकता होगी, तो आप या तो जब प्रतिनिधि (target प्रतिबिंब के माध्यम से Delegate.CreateDelegate लिए पैरामीटर) बनाने वस्तु को शामिल करने की आवश्यकता होगी, या आप (कोई लक्ष्य के साथ एक दूसरे प्रतिनिधि प्रकार का उपयोग करना होगा प्रतिनिधि पर, लेकिन अतिरिक्त रूप से लक्ष्य को param0 के रूप में लेते हुए - यह उपयोग किए जाने पर लक्ष्य को हल करेगा)।

हालांकि, मैं जो कुछ करने की कोशिश कर रहा हूं उस पर थोड़ा सा अनुमान लगा रहा हूं (यह 100% स्पष्ट नहीं है)।

2

एक विशेषता तर्क एक निरंतर अभिव्यक्ति, टाइपो अभिव्यक्ति या एक विशेषता पैरामीटर प्रकार की सरणी निर्माण अभिव्यक्ति होना चाहिए।

2

मुझे एक स्थिर विधि के साथ काम करने का एक उदाहरण देखने में बहुत दिलचस्पी होगी, जैसा कि आप इस सवाल में संभव है! जब तक इस विधि स्थिर atrribute काम नहीं कर रहा है

समस्या है ...

उदा मान लीजिए HandleLoginResponse एक स्थिर है, तब क्या होता है?

मुझे नहीं लगता कि इससे कोई फर्क पड़ेगा। आप एक कॉन्स प्रतिनिधि नहीं बना सकते हैं, इसलिए आप किसी प्रतिनिधि को एक प्रतिनिधि को पास नहीं कर सकते हैं।

2

ईरविकियर: दुर्भाग्यवश, आप सही हैं ... यह स्थिर तरीकों से भी काम नहीं करता है।आपको यह त्रुटि संदेश मिलता है:

त्रुटि CS0182: एक विशेषता तर्क, एक निरंतर अभिव्यक्ति होना चाहिए typeof एक विशेषता पैरामीटर प्रकार की अभिव्यक्ति या सरणी निर्माण अभिव्यक्ति

मुझे क्या करना एक निश्चित विधि को निर्दिष्ट किया जाता है कोशिश कर रहा हूँ जो एक संपत्ति बदल जाती है जब बुलाया जाएगा। एक प्रतिनिधि का उपयोग करना अच्छा होगा। मैंने कल सिर्फ एक स्ट्रिंग के साथ काम किया है, लेकिन यह थोड़ा कमजोर है ... एक स्थिर विधि का उपयोग करना बेहतर होगा, लेकिन यह .NET Framework (3.5, VS2008) के वर्तमान संस्करण के साथ असंभव प्रतीत होता है।

बहुत बुरा!

संबंधित मुद्दे