C # में स्ट्रिंग से फ़ंक्शन को कॉल करना


145

मुझे पता है कि आप php में एक कॉल करने में सक्षम हैं जैसे:

$function_name = 'hello';
$function_name();

function hello() { echo 'hello'; }

क्या यह .Net में संभव है?


2
मैंने देखा कि आपका तरीका publicभी होना चाहिए ।
झापू

जवाबों:


268

हाँ। आप प्रतिबिंब का उपयोग कर सकते हैं। कुछ इस तरह:

Type thisType = this.GetType();
MethodInfo theMethod = thisType.GetMethod(TheCommandString);
theMethod.Invoke(this, userParameters);

56
और इसके लिए "System.Reflection का उपयोग करना" चाहिए।
15

1
यह पैरामीटर के साथ एक फ़ंक्शन को आमंत्रित करने के लिए भी इस्तेमाल किया जा सकता है: जैसे स्ट्रिंग f = "विधि (पैरामीटर 1, पैरामीटर 2)";
थ्रू

प्रतिक्रिया के लिए धन्यवाद @ottobar। मुझे नहीं पता कि यह वही है जिसकी मुझे तलाश है: मुझे अपने c # कोड में SQL स्केलर फ़ंक्शन का उपयोग करने की आवश्यकता थी। मैं इसे कैसे कहूं?
चगबर्ट

1
यदि आपके पास ओवरलोड तरीके हैं, तो FYI यह काम नहीं करता है।
सीन ओ'नील

उपरोक्त कोड के साथ - विधि जिसे लागू किया गया है उसके पास एक्सेस संशोधक होना चाहिए - PUBLIC। यदि गैर जनता कृपया बाइंडिंग झंडे का उपयोग करें - BindingFlags.NonPublic | Type thisType = this.GetType(); MethodInfo theMethod = thisType.GetMethod(TheCommandString, BindingFlags.NonPublic | BindingFlags.Instance); theMethod.Invoke(this, userParameters);
बाइंडिंगफ्लैग्स.इनस्टांस

75

आप प्रतिबिंब का उपयोग करते हुए एक वर्ग उदाहरण के तरीकों को लागू कर सकते हैं, एक गतिशील विधि मंगलाचरण कर सकते हैं:

मान लीजिए कि आपके पास वास्तविक उदाहरण में हेलो नामक एक विधि है (यह):

string methodName = "hello";

//Get the method information using the method info class
 MethodInfo mi = this.GetType().GetMethod(methodName);

//Invoke the method
// (null- no parameter for the method call
// or you can pass the array of parameters...)
mi.Invoke(this, null);

1
एक "स्ट्रिंग" वर्ग के तरीकों के बारे में क्या? फ्रेमवर्क का उपयोग कर 4
Leandro

36
class Program
    {
        static void Main(string[] args)
        {
            Type type = typeof(MyReflectionClass);
            MethodInfo method = type.GetMethod("MyMethod");
            MyReflectionClass c = new MyReflectionClass();
            string result = (string)method.Invoke(c, null);
            Console.WriteLine(result);

        }
    }

    public class MyReflectionClass
    {
        public string MyMethod()
        {
            return DateTime.Now.ToString();
        }
    }

यह कोई वर्ग पर निर्भर नहीं है
Leandro

और विधि शून्य?
किनिकेत

2

एक मामूली स्पर्शरेखा - यदि आप संपूर्ण अभिव्यक्ति स्ट्रिंग को पार्स और मूल्यांकित करना चाहते हैं जिसमें निहित (नेस्टेड!) फ़ंक्शन हैं, तो NCalc ( http://ncalc.codeplex.com/ और nuget) पर विचार करें।

पूर्व। परियोजना प्रलेखन से थोड़ा संशोधित:

// the expression to evaluate, e.g. from user input (like a calculator program, hint hint college students)
var exprStr = "10 + MyFunction(3, 6)";
Expression e = new Expression(exprString);

// tell it how to handle your custom function
e.EvaluateFunction += delegate(string name, FunctionArgs args) {
        if (name == "MyFunction")
            args.Result = (int)args.Parameters[0].Evaluate() + (int)args.Parameters[1].Evaluate();
    };

// confirm it worked
Debug.Assert(19 == e.Evaluate());

और EvaluateFunctionप्रतिनिधि के भीतर आप अपने मौजूदा कार्य को कहेंगे।


0

वास्तव में मैं विंडोज वर्कफ़्लो 4.5 पर काम कर रहा हूं और मुझे एक प्रतिनिधि को एक स्टेटमैचिन से एक विधि को पारित करने के लिए एक तरीका मिला है जिसमें कोई सफलता नहीं है। एकमात्र तरीका जो मुझे मिला वह यह था कि जिस विधि को मैं प्रतिनिधि के रूप में पारित करना चाहता था उस विधि के नाम के साथ एक स्ट्रिंग को पास करना और स्ट्रिंग को विधि के अंदर एक प्रतिनिधि में परिवर्तित करना था। बहुत अच्छा जवाब। धन्यवाद। इस लिंक की जाँच करें https://msdn.microsoft.com/en-us/library/53cz7sc6(v=vs.110).aspx


0
यह कोड मेरे कंसोल .Net अनुप्रयोग में काम करता है
class Program
{
    static void Main(string[] args)
    {
        string method = args[0]; // get name method
        CallMethod(method);
    }
    
    public static void CallMethod(string method)
    {
        try
        {
            Type type = typeof(Program);
            MethodInfo methodInfo = type.GetMethod(method);
            methodInfo.Invoke(method, null);
        }
        catch(Exception ex)
        {
            Console.WriteLine("Error: " + ex.Message);
            Console.ReadKey();
        }
    }
    
    public static void Hello()
    {
        string a = "hello world!";
        Console.WriteLine(a);
        Console.ReadKey();
    }
}

एसओ में आपका स्वागत है! मुझे आपका जवाब पसंद है, क्या आप थोड़ा और समझा सकते हैं कि आप क्या कर रहे हैं?
a.deshpande012

हाय, ऑफ कोर्स। यह एक कंसोल है। नेट अनुप्रयोग, "प्रोग्राम क्लास" के अंदर कई तरीके या कार्य हैं, उदाहरण के लिए: हैलो, हैलो 2, हैलो। विधि "CallMethod (स्ट्रिंग विधि)" खोज और मुझे "प्रोग्राम क्लास" के अंदर किसी भी विधि को लागू करने दें, इसे स्ट्रिंग पैरामीटर के रूप में नाम दिया जाता है। जब मैं "विंडोज कंसोल" से एप्लिकेशन निष्पादित करता हूं: मैं लिखता हूं: "नाम ऐप" + "विधि मुझे इनवोक चाहिए"। उदाहरण के लिए: myapp हैलो, फिर "हैलो वर्ल्ड!" लौटें। "Myapp hello2" या "myapp hello3" भी हो सकता है। मुझे लगता है कि किसी भी .Net अनुप्रयोग में काम कर सकता है।
रानोबे जूले

आपको प्रतिबिंब वर्ग जोड़ना होगा: "System.Reflection का उपयोग करना;"।
रानोबे जूले

-9

C # में, आप फ़ंक्शन पॉइंटर्स के रूप में प्रतिनिधि बना सकते हैं। उपयोग के बारे में जानकारी के लिए निम्नलिखित MSDN लेख देखें:http://msdn.microsoft.com/en-us/library/ms173171(VS.80).aspx

    public static void hello()
    {
        Console.Write("hello world");
    }

   /* code snipped */

    public delegate void functionPointer();

    functionPointer foo = hello;
    foo();  // Writes hello world to the console.

15
यह तार से नहीं है!
नवाफाल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.