Php biliyorum gibi bir arama yapmak mümkün:
$function_name = 'hello';
$function_name();
function hello() { echo 'hello'; }
Bu .Net'te mümkün mü?
Php biliyorum gibi bir arama yapmak mümkün:
$function_name = 'hello';
$function_name();
function hello() { echo 'hello'; }
Bu .Net'te mümkün mü?
Yanıtlar:
Evet. Yansımayı kullanabilirsiniz. Bunun gibi bir şey:
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);
Dinamik yöntem çağırma işlemi yaparak yansıma kullanarak bir sınıf örneğinin yöntemlerini çağırabilirsiniz:
Bir gerçek örnekte merhaba adında bir yönteminiz olduğunu varsayalım (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);
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();
}
}
Hafif bir teğet - (iç içe!) İşlevler içeren bir ifade dizesinin tamamını ayrıştırmak ve değerlendirmek istiyorsanız, NCalc'i ( http://ncalc.codeplex.com/ ve nuget) düşünün
Ör. proje belgelerinden biraz değiştirildi:
// 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
Delege içinde mevcut işlevinizi çağırırsınız.
Aslında Windows Workflow 4.5 üzerinde çalışıyorum ve bir temsilci bir statemachine başarılı olmayan bir yönteme geçmek için bir yol bulmak zorunda. Bulmam gereken tek yol, delege olarak geçmek istediğim yöntemin adıyla bir dize geçirmek ve dizeyi yöntem içindeki bir temsilciye dönüştürmekti. Çok güzel bir cevap. Teşekkürler. Bu bağlantıyı kontrol edin https://msdn.microsoft.com/en-us/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();
}
}
C # 'da, işlev işaretçileri olarak delegeler oluşturabilirsiniz. Kullanım hakkında bilgi için aşağıdaki MSDN makalesine bakın: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.
public
.