2010-09-18 11 views
6

मैंने एक्सएनए में अपने गेम के लिए एक कंसोल बनाया है और मेरे पास एक कमांड दर्ज करने के लिए एक प्रतिनिधि है। फिलहाल प्रतिनिधि एक बूल वैल्यू लौट रहा है। मैंने कंसोल क्लास (जो झूठी रिटर्न देता है) के अंदर एक कार्यक्रम घोषित कर दिया है और फिर अन्य कार्यक्रमों से इस घटना की सदस्यता ली है। विचार यह है कि, यदि इस घटना की सदस्यता लेने वाले वर्गों में से कोई भी सत्य वापस नहीं आता है तो यह माना जाता है कि उपयोगकर्ता ने एक अवैध आदेश दर्ज किया है। हालांकि यदि सब्सक्राइब किए गए वर्गों में से कम से कम एक सत्य सत्य लौटाता है तो आदेश मान्य माना जाता है।सी # "या" घटना प्रतिनिधि बैल लौट रहे हैं

फिलहाल, केवल एक वर्ग को सही या गलत लौटने के लिए ध्यान में रखा जाता है, क्या कोई तरीका है कि मैं सभी सब्सक्राइबिंग कक्षाओं के वापसी मूल्यों को देख सकता हूं या उनका परिणाम?

धन्यवाद,

+1

नाइस क्यू - AFAIK एक साधारण असाइनमेंट हमेशा अंतिम ग्राहक के परिणाम को वापस कर देगा। – StuartLC

उत्तर

3

मैं यह पता लगा बस के रूप में मैं इस सवाल उठाया: पी

bool handled = false; 
foreach (Delegate d in CommandProcessed.GetInvocationList()) 
    handled |= (bool) d.DynamicInvoke (gameTime, command.ToString()); 

if (!handled) { } // Command Unrecognized 

कहाँ CommandProcessed मेरी घटना है कि कक्षाओं की सदस्यता लें।
मेरा प्रतिनिधि दो तर्क लेता है: गेमटाइम और कमांड स्ट्रिंग।

+0

हाँ - मुझे हाल ही में जंजीर सत्यापन के लिए इस समस्या को हल करना पड़ा। Bitwise या ऑपरेटर बुलियन या ऑपरेटर की तरह शॉर्ट-सर्किट नहीं करता है। – arootbeer

6

वर्ग है कि घटना वाणी अंदर से, आप घटना (एक क्षेत्र की तरह घटना मानकर) के आह्वान-सूची प्राप्त कर सकते हैं। उनमें से प्रत्येक को व्यक्तिगत रूप से आमंत्रित करने से आप प्रत्येक ग्राहक के वापसी मूल्य को घटना में देख सकते हैं।

उदाहरण के लिए:

public event Func<bool> MyEvent = delegate { return false; }; 

...  

private bool EmitMyEventAndReturnIfAnySubscriberReturnsTrue() 
{ 
    return MyEvent.GetInvocationList() 
        .Cast<Func<bool>>() 
        .Select(method => method()) 
        .ToList() //Warning: Has side-effects 
        .Any(ret => ret); 
} 

इस उदाहरण में, हर ग्राहक घटना के बारे में बताया जाता है - कोई शॉर्ट सर्किट होता है कि उनमें से कोई सकारात्मक प्रतिक्रिया करता है। ToList() पर कॉल को हटाकर वांछित अगर इस व्यवहार को आसानी से बदला जा सकता है।

हालांकि ईमानदार होने के लिए, मुझे वास्तव में ऐसी घटनाएं पसंद नहीं हैं जो मूल्यों को वापस लाती हैं; उनके अर्थशास्त्र ग्राहकों के लिए स्पष्ट नहीं हैं। यदि संभव हो तो मैं डिज़ाइन बदल दूंगा।

संपादित करें: टिमवी की टिप्पणी के आधार पर अनुक्रम के पूर्ण निष्पादन को मजबूर करने में सुधारित त्रुटि।

+2

इसके लिए LINQ का उपयोग करने के लिए मेरे पास नहीं हुआ होगा। अच्छा उत्तर। –

+0

मैंने दो अलग-अलग डिज़ाइनों को देखा और यह दोनों का क्लीनर था। और इसे समझने और कार्यान्वित करने में काफी आसान है। मैं लिंकक से परिचित नहीं हूं लेकिन मुझे नीचे वर्णित एक वैकल्पिक समाधान मिला है। – Dave

+0

@ डेव: आपके द्वारा पोस्ट किया गया वैकल्पिक समाधान मेरे उत्तर के समान विचार है - यह चाल आमंत्रण-सूची तक पहुंचने के लिए है। महान। – Ani

0

मैं मूल्यों को वापस करने वाली घटनाओं के बारे में समस्या से सहमत हूं क्योंकि यह मेरे साथ भी दिखता है।

class CommandEventArgs : EventArgs 
{ 
    public DateTime GameTime {get; set; } 
    public string Command {get; set;} 
    public bool Valid {get; set;} 
} 

तो घटना आह्वान करने के लिए इस विधि का एक उदाहरण का उपयोग और उसके बाद श्रोता आदेश को पहचानता है, तो यह सच करने के लिए Valid निर्धारित किया है: हालांकि एक विकल्प के आप एक नया वर्ग CommandEventArgs बना सकते है। इसलिए यदि Valid आमंत्रण के बाद भी झूठा है तो आप जानते हैं कि आदेश अपरिचित है।

इस प्रकार .NET कुंजीपटल ईवेंट को संभालता है जो आपने KeyEventArgs.Handled को ईवेंट के साथ होने वाली किसी और कार्रवाई को दबाने के लिए सच में सेट किया है।

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