如何在不知道 C# 名称的情况下调用方法?
How to call a method without knowing it's name in C#?
是否可以在不知道名称的情况下调用方法?我想象它是一种存储为变量的方法,如下所示:
public static Method Example;
private static void DoSomething()
{
//Something
}
private static void Main()
{
Example = DoSomething();
}
public static void ExecuteSomething()
{
Example();
}
有没有类似的,或者类似功能的?我查看了委托,但不确定我是否理解正确,或者这是否正是我要找的。
您描述的是 delegate
。它们可以在 variable/field/property/eventhandler 声明中使用。 C# 带有一些方便的泛型,您可以使用它们来描述您期望的函数。一些例子:
Action // A void function
Action<T> // A void function that accepts a parameter of type T
Action<Tin1, Tin2, ...> // A void function that accepts Tx parameters
Func<T> // A function that returns an object of type T
Func<Tout, Tin1, Tin2, ...> // A function that returns Tout an accepts Tx as parameters
Predicate<T> // A function that returns bool and accepts parameter T
或者,如果您想使用 delegate
关键字编写自己的委托:
delegate void MySpecialEventHandler(object sender, object data)
示例:
//EventHandler definition
public delegate void PrintedSomethingEventHandler(string message);
//Event
public event PrintedSomethingEventHandler PrintedSomething;
//e.g. "Function Hook"
private Func<string,string> _externalFilter;
public void SetFilter(Func<string,string> filter)
{
_externalFilter = filter;
}
private void PrintA(string message)
{
Debug.WriteLine(message);
}
private void PrintB(string message)
{
Console.WriteLine(message);
}
private bool ContainsProfanity(string message)
{
return message.Contains("%$&!");
}
public void Print(string message, bool debug)
{
Action<string> action;
Predicate<string> filter = ContainsProfanity;
if(filter(message))
return;
if(_externalFilter != null)
message = _externalFilter(message);
if(debug)
action = PrintA;
else
action = PrintB;
action(message);
if(PrintedSomethingEventHandler != null)
PrintedSomethingEventHandler(message);
}
是否可以在不知道名称的情况下调用方法?我想象它是一种存储为变量的方法,如下所示:
public static Method Example;
private static void DoSomething()
{
//Something
}
private static void Main()
{
Example = DoSomething();
}
public static void ExecuteSomething()
{
Example();
}
有没有类似的,或者类似功能的?我查看了委托,但不确定我是否理解正确,或者这是否正是我要找的。
您描述的是 delegate
。它们可以在 variable/field/property/eventhandler 声明中使用。 C# 带有一些方便的泛型,您可以使用它们来描述您期望的函数。一些例子:
Action // A void function
Action<T> // A void function that accepts a parameter of type T
Action<Tin1, Tin2, ...> // A void function that accepts Tx parameters
Func<T> // A function that returns an object of type T
Func<Tout, Tin1, Tin2, ...> // A function that returns Tout an accepts Tx as parameters
Predicate<T> // A function that returns bool and accepts parameter T
或者,如果您想使用 delegate
关键字编写自己的委托:
delegate void MySpecialEventHandler(object sender, object data)
示例:
//EventHandler definition
public delegate void PrintedSomethingEventHandler(string message);
//Event
public event PrintedSomethingEventHandler PrintedSomething;
//e.g. "Function Hook"
private Func<string,string> _externalFilter;
public void SetFilter(Func<string,string> filter)
{
_externalFilter = filter;
}
private void PrintA(string message)
{
Debug.WriteLine(message);
}
private void PrintB(string message)
{
Console.WriteLine(message);
}
private bool ContainsProfanity(string message)
{
return message.Contains("%$&!");
}
public void Print(string message, bool debug)
{
Action<string> action;
Predicate<string> filter = ContainsProfanity;
if(filter(message))
return;
if(_externalFilter != null)
message = _externalFilter(message);
if(debug)
action = PrintA;
else
action = PrintB;
action(message);
if(PrintedSomethingEventHandler != null)
PrintedSomethingEventHandler(message);
}