2011-03-04 11 views
5

से डेटा के आधार पर गतिशील रूप से कॉलिंग # विधियों को कॉल करना मेरे मालिक ने मुझे गणना इंजन देखने के लिए कहा है। प्रभावी रूप से, उपयोगकर्ता के पास डेटा की एक तालिका होगी जिसमें गणना की जा सकती है। वे हमारे द्वारा लागू किए गए कुछ प्रतिबंधों के आधार पर अपनी गणनाएं भी बनाएंगे (निर्मित गणना डेटाबेस में संग्रहीत की जाएंगी)डेटाबेस

क्या सी # में एक विशिष्ट विधि को कॉल करना संभव है, जो उसमें निर्भर है डेटाबेस? तो यदि डेटाबेस कहता है, तो गणना एक मानक विचलन करना चाहिए। जब हमें डेटाबेस से वह जानकारी मिलती है, तो क्या एक मानक विचलन विधि को कॉल करना संभव है जो हमारे पास सी # में होगा?

मुझे आशा है कि यह स्पष्ट है।

+0

प्रतिबिंब का उपयोग करें, – Stecya

+0

पर बहुत सारे उदाहरण हैं, आप प्रत्येक विधि को एक पूर्णांक के रूप में कोड कर सकते हैं और डीबी में स्टोर कर सकते हैं और फिर उस पूर्णांक पर एक स्विच कर सकते हैं, जिसमें प्रत्येक मामले में प्रासंगिक विधि को कॉल किया जा सकता है? –

+2

क्या आप इसे और अधिक स्पष्ट रूप से समझा सकते हैं क्योंकि आपने जो लिखा है उससे मेरा सुझाव है कि आप बस अपने सी # ऐप से डीबी से जुड़ें और फिर कुछ स्थितियों को किस स्थिति में बुलाया जाना चाहिए और यह सब कुछ है। या शायद आप कुछ और चाहते हैं? – Tobiasz

उत्तर

3

संचालन जो अपने डेटा पर निष्पादित किया जाएगा के छोटे/जाना जाता राशि को देखते हुए, मैं चुनते हैं, मैन्युअल रूप से इन आपरेशनों कोड होगा डेटा डेटाबेस से लिया गया के आधार पर । extendability/रख-रखाव के लिए, यह एक सरल स्विच बयान उपयोग करने के बजाय इस के लिए एक उचित डिजाइन बनाने के लिए सबसे अच्छा है। मुझे लगता है कि Strategy pattern आपकी आवश्यकताओं के अनुरूप होगा।

जैसा कि अन्य ने कहा है, आप डेटाबेस में निर्दिष्ट विधियों को कॉल करने के लिए reflection का उपयोग कर सकते हैं। इस दृष्टिकोण के साथ समस्या यह है अपने डेटाबेस में डेटा दृढ़ता से विधि हस्ताक्षर से जुड़ा हुआ है। यह पहला दृष्टिकोण से भी कम समय पोषणीय है, लेकिन कम से कम कोड समायोजन के साथ महान extendability अनुमति मिल जाएगी। MethodInfo.Invoke() का उपयोग कर एक और नकारात्मक पक्ष धीमा है।

यदि आप प्रतिबिंब का चयन करेंगे, लेकिन Invoke() दृष्टिकोण बहुत धीमी होने के लिए खोजें, तो मैं this article by Jon Skeet की अनुशंसा कर सकता हूं जो बताता है कि विधिप्रवाह को एक प्रतिनिधि उदाहरण में कैसे परिवर्तित करें। यह एक प्रमुख गति बढ़ावा देता है। मैंने हाल ही में a generic implementation using expression trees लिखा था।

सब कुछ, ऐसा लगता है कि विकल्प 1 अभी भी आपके उद्देश्यों के लिए सबसे अच्छा है।

0

आप जिस कार्य को अपने रिकॉर्ड के क्षेत्र (या अदिश) के मूल्य के आधार चाहते निष्पादित करने के लिए डेटाबेस से आ रही सी # में स्विच बयान का उपयोग कर सकते हैं। यह ठीक है यदि आपके पास समर्थित संचालन की एक छोटी/सीमित संख्या है, अन्यथा निश्चित रूप से आप reflection और MethodInfo क्लास का उपयोग किसी निश्चित वर्ग पर "स्ट्रिंग नाम" द्वारा सदस्य विधि का आह्वान करने के लिए कर सकते हैं।

+0

मेरा मानना ​​है कि गणना (पहला विकल्प) बहुत तेज़ और सुरक्षित है। क्या किसी को डीबी में File.Delete() या अन्य ग़लत विधि नाम डालने से रोक देगा? – jonathanpeppers

+0

मैं सहमत हूं, मैं रनटाइम कोड संकलन के बारे में दूसरी बात के रूप में नहीं सोच रहा था, लेकिन डीबी में गणना एंजिन के विधि का नाम होने के नाते। –

2

हाँ, यह संभव है; इसे प्रतिबिंब कहा जाता है और यह एक मानक सी # सुविधा है। वेब पर कई ट्यूटोरियल मौजूद हैं; यहाँ कुछ बहुत ही सरल उदाहरण कोड है:

using System; 
using System.Reflection; 

class CallMethodByName 
{ 
    string name; 

    CallMethodByName (string name) 
    { 
     this.name = name; 
    } 

    public void DisplayName()  // method to call by name 
    { 
     Console.WriteLine (name); // prove we called it 
    } 

    static void Main() 
    { 
     // Instantiate this class 
     CallMethodByName cmbn = new CallMethodByName ("CSO"); 

     // Get the desired method by name: DisplayName 
     MethodInfo methodInfo = 
     typeof (CallMethodByName).GetMethod ("DisplayName"); 

     // Use the instance to call the method without arguments 
     methodInfo.Invoke (cmbn, null); 
    } 
} 

http://en.csharp-online.net/CSharp_FAQ:_How_call_a_method_using_a_name_string

0

मैं तुम्हें रणनीति पैटर्न (http://www.dofactory.com/Patterns/PatternStrategy.aspx)

आप विभिन्न रणनीतियों (एल्गोरिदम) विभिन्न आवश्यक गणना के लिए लोड कर सकते हैं लागू सुझाव है।

एक अच्छा पोस्ट के रूप में अच्छी तरह से http://blogs.microsoft.co.il/blogs/gilf/archive/2009/11/22/applying-strategy-pattern-instead-of-using-switch-statements.aspx

0

हाँ, आप यह प्रतिबिंब का उपयोग कर सकते है। आप एक कक्षा लिख ​​सकते हैं जिसमें उपयोगकर्ता द्वारा किए जा सकने वाले सभी परिचालन शामिल हैं और फिर गतिशील रूप से इसकी विधियों को कॉल करें।

public static class UserOperations 
{ 
    public static decimal Average(IEnumerable<decimal> source) 
    { 
     return source.Average(); 
    } 

    // Other methods 
} 


class Program 
{ 
    static void Main(string[] args) 
    { 
     // The operation retrieved from the db 
     string operation = "Average"; 
     // The items on which the operations should be performed 
     decimal[] items = { 22m, 55m, 77m }; 

     object result = typeof(UserOperations).GetMethod(operation).Invoke(null, new object[] { items }); 
     Console.WriteLine(result); 
     Console.ReadLine(); 
    } 
}