मैं इस तरह एक बड़ा स्विच बयान के साथ इस विधि है:स्टेटिक शब्दकोश उदाहरण तरीकों के प्रतिनिधियों युक्त
public bool ExecuteCommand(string command, string args)
{
bool result = false;
switch (command)
{
case "command1": result = Method1(args); break;
case "command2": result = Method2(args); break;
// etc.
}
return result;
}
private bool Method1(string args) {...}
अब मैं Func<>
प्रतिनिधियों का एक शब्दकोश के साथ इस जगह इतना है कि मैं स्विच बयान समाप्त कर सकते हैं के बारे में सोचा:
private Dictionary<string, Func<string, bool>> _commands = new ...;
public MyClass()
{
_commands.Add("command1", Method1);
// etc:
}
public bool ExecuteCommand(string command, string args)
{
return _commands[command](args);
}
समस्या मैं इस के साथ देखते हैं, कि एक नया शब्दकोश instantiated और MyClass के प्रत्येक नया उदाहरण के साथ से भर जाता है है।
क्या किसी भी तरह से उस शब्दकोश को बनाने के लिए संभव है (उदाहरण के तरीकों के प्रतिनिधियों को एक स्थिर सदस्य), जो स्थिर कन्स्ट्रक्टर में केवल एक बार शुरू किया जाएगा?
उदा। कुछ इस तरह (काम नहीं करता है):
private static Dictionary<string, Func<string, bool>> _commands = new ...;
static MyClass()
{
// the following line will result in a compiler error:
// error CS0120: An object reference is required for the non-static field,
// method, or property 'MyClass.Method1(string, string)'
_commands.Add("command1", MyClass.Method1);
}
यह क्यों काम नहीं करता है, त्रुटि क्या है? हो सकता है कि अगर आप एक स्थिर गेटर में आलसी शुरू करें, तो यह काम करता है? इस तरह मैं इसे आमतौर पर सिंगलटन आदि के लिए जाता हूं, – ewernli
@ewernli: संकलक त्रुटि के साथ प्रश्न अद्यतन किया। (ध्यान दें: मुझे आवृत्ति विधियों को कॉल करने की आवश्यकता है, स्थैतिक तरीकों से नहीं)। – M4N
आपको जो त्रुटि मिल रही है वह 'MyClass.Method1' को आपके शब्दकोश में' Func 'के रूप में जोड़ने का प्रयास संदर्भित कर रहा है। शब्दकोश की स्थैतिक स्थापना नहीं है। 'MyClass' को 'विधि 1' विधि एक स्थैतिक विधि है? आपको जो त्रुटि मिल रही है, वह इंगित करती है कि यह नहीं है और संकलक यह अपेक्षा करता है। –
Clayton