Gọi một hàm từ một chuỗi trong C #


145

Tôi biết trong php bạn có thể thực hiện một cuộc gọi như:

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

function hello() { echo 'hello'; }

Điều này có thể có trong .Net không?


2
Tôi thấy rằng phương pháp của bạn cũng nên được public.
zapoo

Câu trả lời:


268

Đúng. Bạn có thể sử dụng sự phản chiếu. Một cái gì đó như thế này:

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

56
Và điều này đòi hỏi "sử dụng System.Reflection;"
jptsetung

1
Điều này cũng có thể được sử dụng để gọi một hàm với tham số: ví dụ: chuỗi f = "phương thức (tham số1, tham số2)";
Sấm sét

Cảm ơn @ottobar đã phản hồi. Tôi không biết đây có phải là điều tôi cũng đang tìm kiếm không: Tôi cần sử dụng hàm vô hướng SQL trong mã c # của mình. Làm thế nào để tôi gọi nó?
Chagbert

1
FYI này không hoạt động nếu bạn có phương pháp quá tải.
Sean O'Nilil

Với đoạn mã trên - Phương thức được gọi phải có công cụ sửa đổi truy cập - PUBLIC. Nếu không công khai, vui lòng sử dụng cờ Binding - BindingFlags.NonPublic | BindingFlags.Instance .. Type thisType = this.GetType(); MethodInfo theMethod = thisType.GetMethod(TheCommandString, BindingFlags.NonPublic | BindingFlags.Instance); theMethod.Invoke(this, userParameters);
Sibgath

75

Bạn có thể gọi các phương thức của một thể hiện lớp bằng cách sử dụng sự phản chiếu, thực hiện một lời gọi phương thức động:

Giả sử rằng bạn có một phương thức gọi là hello trong trường hợp thực tế (điều này):

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
Còn các phương thức từ một lớp "chuỗi" thì sao? sử dụng khung 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();
        }
    }

đây là phụ thuộc không có lớp học
Leandro

Và phương pháp void?
Kiquenet

2

Một tiếp tuyến nhỏ - nếu bạn muốn phân tích và đánh giá toàn bộ chuỗi biểu thức có chứa các hàm (lồng nhau!), Hãy xem xét NCalc ( http://ncalc.codeplex.com/ và nuget )

Ví dụ. sửa đổi một chút từ tài liệu dự án:

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

Và trong EvaluateFunctionđại biểu bạn sẽ gọi chức năng hiện có của bạn.


0

Trong thực tế, tôi đang làm việc trên Windows Workflow 4.5 và tôi phải tìm cách chuyển một đại biểu từ một stHRachine sang một phương pháp không thành công. Cách duy nhất tôi có thể tìm thấy là truyền một chuỗi có tên của phương thức tôi muốn truyền làm đại biểu và chuyển đổi chuỗi thành đại biểu bên trong phương thức. Câu trả lời rất hay. Cảm ơn. Kiểm tra liên kết này https://msdn.microsoft.com/en-us/l Library / 53cz7sc6 (v = vs.110) .aspx


0
Mã này hoạt động trong ứng dụng .Net của tôi
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();
    }
}

Chào mừng đến với SO! Tôi thích câu trả lời của bạn, bạn có thể giải thích thêm một chút về những gì bạn đang làm không?
a.deshpande012

Xin chào, tất nhiên. Đây là một ứng dụng console .net, bên trong "lớp chương trình" có một số phương thức hoặc hàm, ví dụ: hello, hello2, hello2. Phương thức "CallMethod (phương thức chuỗi)" tìm kiếm và để tôi gọi bất kỳ phương thức nào trong "lớp chương trình" được gọi bởi tên đó là tham số chuỗi. Khi tôi thực thi ứng dụng từ "Windows Console": Tôi viết: "tên ứng dụng" + "phương thức tôi cần gọi". Ví dụ: myapp xin chào, sau đó trả về "hello world!". Cũng có thể là "myapp hello2" hoặc "myapp hello3". Tôi nghĩ rằng có thể làm việc trong bất kỳ ứng dụng .Net.
ranobe

Bạn phải thêm lớp Reflection: "bằng cách sử dụng System.Reflection;".
ranobe

-9

Trong C #, bạn có thể tạo đại biểu làm con trỏ hàm. Kiểm tra bài viết MSDN sau để biết thông tin về cách sử dụng:http://msdn.microsoft.com/en-us/l 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
Đây không phải là từ chuỗi!
nawfal
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.