Memanggil fungsi dari string dalam C #

145

Saya tahu di php Anda bisa menelepon seperti:

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

function hello() { echo 'hello'; }

Apakah ini mungkin di .Net?

Jeremy Boyd
sumber
2
Saya melihat bahwa metode Anda publicjuga harus .
zapoo

Jawaban:

268

Iya. Anda bisa menggunakan refleksi. Sesuatu seperti ini:

Type thisType = this.GetType();
MethodInfo theMethod = thisType.GetMethod(TheCommandString);
theMethod.Invoke(this, userParameters);
ottobar
sumber
56
Dan ini membutuhkan "menggunakan System.Reflection;"
jptsetung
1
Bisakah ini juga digunakan untuk menjalankan fungsi dengan parameter: mis. String f = "method (parameter1, parameter2)";
Guntur
Terima kasih @ottobar atas tanggapannya. Saya tidak tahu apakah ini yang saya cari: Saya perlu menggunakan fungsi skalar SQL dalam kode c # saya. Bagaimana saya menyebutnya?
Chagbert
1
FYI ini tidak berfungsi jika Anda memiliki metode kelebihan beban.
Sean O'Neil
Dengan kode di atas - Metode yang dipanggil harus memiliki pengubah akses - PUBLIC. Jika non publik silakan gunakan bendera Binding - BindingFlags.NonPublic | BindingFlags.Instance .. Type thisType = this.GetType(); MethodInfo theMethod = thisType.GetMethod(TheCommandString, BindingFlags.NonPublic | BindingFlags.Instance); theMethod.Invoke(this, userParameters);
Sibgath
75

Anda dapat memanggil metode instance kelas menggunakan refleksi, melakukan pemanggilan metode dinamis:

Misalkan Anda memiliki metode bernama halo dalam instance aktual (ini):

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);
CMS
sumber
1
bagaimana dengan metode dari kelas "string"? menggunakan framework 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();
        }
    }
BFree
sumber
ini tidak tergantung kelas
Leandro
Dan metode batal?
Kiquenet
2

Sedikit garis singgung - jika Anda ingin menguraikan dan mengevaluasi seluruh string ekspresi yang berisi fungsi (bersarang!), Pertimbangkan NCalc ( http://ncalc.codeplex.com/ dan nuget)

Ex. sedikit dimodifikasi dari dokumentasi proyek:

// 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());

Dan dalam EvaluateFunctiondelegasi Anda akan memanggil fungsi yang ada.

drzaus
sumber
0

Pada kenyataannya saya bekerja pada Windows Workflow 4.5 dan saya harus menemukan cara untuk mengirimkan delegasi dari statemachine ke metode yang tidak berhasil. Satu-satunya cara saya menemukan adalah untuk lulus string dengan nama metode yang ingin saya sampaikan sebagai delegasi dan untuk mengkonversi string ke delegasi di dalam metode. Jawaban yang sangat bagus Terima kasih. Periksa tautan ini https://msdn.microsoft.com/en-us/library/53cz7sc6(v=vs.110).aspx

Antonio Leite
sumber
0
Kode ini berfungsi di aplikasi .Net konsol saya
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();
    }
}
ranobe
sumber
Selamat datang di SO! Saya suka jawaban Anda, bisakah Anda menjelaskan sedikit lebih banyak tentang apa yang Anda lakukan?
a.deshpande012
Hai, tentu saja. Ini adalah aplikasi konsol .net, di dalam "kelas program" ada beberapa metode atau fungsi, misalnya: halo, hello2, hello2. Metode "CallMethod (metode string)" mencari dan biarkan saya memanggil metode apa pun di dalam "kelas program" yang dipanggil dengan nama itu sebagai parameter string. Ketika saya menjalankan aplikasi dari "Windows Console": Saya menulis: "name app" + "metode yang perlu saya panggil". Misalnya: myapp hello, lalu kembalikan "hello world!". Bisa juga "myapp hello2" atau "myapp hello3". Saya pikir bisa bekerja di aplikasi .Net apa pun.
ranobe
Anda harus menambahkan kelas Refleksi: "using System.Reflection;".
ranobe
-9

Di C #, Anda bisa membuat delegasi sebagai pointer fungsi. Lihat artikel MSDN berikut untuk informasi tentang penggunaan: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.
regex
sumber
15
ini bukan dari string!
nawfal