2009-02-12 46 views
105

Tôi biết trong php bạn có thể thực hiện cuộc gọi như:Gọi một hàm từ một chuỗi trong C#

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

function hello() { echo 'hello'; } 

Đây có phải là có thể trong Net?

+0

Tôi thấy rằng phương pháp của bạn cũng nên là 'công khai'. – zapoo

Trả lời

197

Có. 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); 
+36

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

+0

Điều này cũng có thể được sử dụng để gọi một hàm có tham số: ví dụ: string f = "method (parameter1, parameter2)"; – Thunder

+0

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

-5

Trong C#, bạn có thể tạo đại biểu làm con trỏ hàm. Kiểm tra các bài viết MSDN sau đây để biết thông tin về cách sử dụng: 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. 
+10

đây không phải là từ chuỗi! – nawfal

31
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(); 
     } 
    } 
+0

điều này không phụ thuộc vào lớp học –

54

Bạn có thể gọi các phương pháp của một cá thể của lớp sử dụng phản chiếu, làm một phương pháp gọi động:

Giả sử rằng bạn có một phương pháp được gọi là hello trong ví dụ thực tế (this):

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); 
+0

câu trả lời đơn giản. – Fattie

+0

những gì về phương pháp từ một lớp "chuỗi"? sử dụng khung 4 –

+0

Xin chào Leandro Bạn có thể làm rõ nhận xét của mình không? Điều này có thể giúp tôi và những người khác quan tâm đến câu hỏi này –

0

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

Ví dụ: hơi sửa đổi 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 số EvaluateFunction đại biểu bạn sẽ gọi chức năng hiện tại của mình.

0

Trong thực tế tôi đang làm việc trên Windows Workflow 4.5 và tôi đã tìm cách để chuyển một đại biểu từ một statemachine đến một phương pháp không thành công. Cách duy nhất tôi đã tìm thấy là để vượt qua một chuỗi với tên của phương pháp tôi muốn vượt qua như là đại biểu và để chuyển đổi chuỗi để một đại biểu bên trong phương pháp. 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/library/53cz7sc6(v=vs.110).aspx

Các vấn đề liên quan