如何在不知道 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);
}