C#の文字列から関数を呼び出す


145

私はphpであなたが次のような呼び出しをすることができることを知っています:

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

function hello() { echo 'hello'; }

これは.Netで可能ですか?


2
あなたの方法publicもそうあるべきだと私は見ました。
zapoo 2013

回答:


268

はい。リフレクションを使用できます。このようなもの:

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

56
そして、これには「System.Reflectionの使用」が必要です。
jptsetung 2013

1
これを使用して、パラメーター付きの関数を呼び出すこともできます。例:string f = "method(parameter1、parameter2)";
サンダー

返信いただきありがとうございます@ottobar。これが私が探しているものかどうかはわかりません:c#コードでSQLスカラー関数を使用する必要がありました。どうやって呼び出すのですか?
Chagbert、2015

1
参考までに、オーバーロードされたメソッドがある場合、これは機能しません。
Sean O'Neil 2017

上記のコードでは-呼び出されるメソッドにはアクセス修飾子-PUBLICが必要です。非公開の場合は、バインディングフラグを使用してください-BindingFlags.NonPublic | BindingFlags.Instance .. Type thisType = this.GetType(); MethodInfo theMethod = thisType.GetMethod(TheCommandString, BindingFlags.NonPublic | BindingFlags.Instance); theMethod.Invoke(this, userParameters);
Sibgath

75

リフレクションを使用してクラスインスタンスのメソッドを呼び出し、動的メソッドを呼び出すことができます。

実際のインスタンス(this)にhelloというメソッドがあるとします。

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

そしてメソッドvoid?
Kiquenet

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

事実、私はWindows Workflow 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();
    }
}

SOへようこそ!私はあなたの答えが好きです、あなたはあなたが何をしているのかについてもう少し説明してもらえますか?
a.deshpande012

こんにちは、もちろん。これはコンソール.netアプリケーションです。「プログラムクラス」内には、hello、hello2、hello2など、いくつかのメソッドまたは関数があります。メソッド「CallMethod(string method)」を検索し、その名前で呼び出された「プログラムクラス」内のメソッドを文字列パラメーターとして呼び出させます。「Windowsコンソール」からアプリケーションを実行する場合:「name app」+「メソッドを呼び出す必要があります」と書きます。例:myapp hello、次に「hello world!」を返します。「myapp hello2」または「myapp hello3」の場合もあります。どの.Netアプリケーションでも機能すると思います。
ranobe

Reflectionクラス「using System.Reflection;」を追加する必要があります。
ranobe

-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
これは弦からのものではありません!
nawfal
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.