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?
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?
Câu trả lời:
Đú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);
Type thisType = this.GetType(); MethodInfo theMethod = thisType.GetMethod(TheCommandString, BindingFlags.NonPublic | BindingFlags.Instance); theMethod.Invoke(this, userParameters);
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);
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();
}
}
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.
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
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();
}
}
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.
public
.