如何在 C# 中从特殊函数(仅使用它们的字符串名称)调用类中的其他函数

本文关键字:函数 字符串 其他 调用 | 更新日期: 2023-09-27 18:32:03

我有一个名为 GoldClass 的类。它有四种方法,名称F()S()TH()Fo()。在方法FO().我想调用其他三种方法(F,S,TH),但只是像这样使用它们的名称。

public void Fo()
{
    list <string> FuncsList=new list<string>();
    FuncsList.Add("F");
    FuncsList.Add("S");
    FuncsList.Add("TH");
    //NOW I WANT TO CALL THEM BUT USE MY STRINGS IN MY FUNCSLIST  
}

我一开始使用反射...但是我正在为类中的公共变量分配一些值。当反射创建新实例时,我在公共变量中的所有数据都会丢失。

如何在 C# 中从特殊函数(仅使用它们的字符串名称)调用类中的其他函数

有什么特别的原因吗,你需要将它们存储为字符串。如果它们都是同一类中的无参数 void 方法,则可以将它们存储为 Action

void Main()
{
    A();
}
public void A()
{
    List<Action> list = new List<Action>();
    list.Add(B);
    list.Add(C);
    list.Add(D);
    foreach(Action action in list){
        action();
    }
}

public void B()
{
    Console.WriteLine("B Called");
}

public void C()
{
    Console.WriteLine("C Called");
}

public void D()
{
    Console.WriteLine("D Called");
}

话虽如此,完全不清楚为什么你需要这样做。为什么需要动态执行此操作。以下还不够。

public void FO()
{
    F();
    S();
    TH();
}

您可以使用字符串调用函数。查看此链接以获取更多信息http://msdn.microsoft.com/en-us/library/system.type.invokemember.aspx

您可以使用字符串和操作的字典:

public class Example
{
    private Dictionary<string, Action> _map = new Dictionary<string, Action>();
    public Example()
    {
        _map["A"] = A;
        _map["B"] = B;
        _map["C"] = C;
    }
    public void A() { }
    public void B() { }
    public void C() { }
    public void CallByString(string func)
    {
        if(_map.ContainsKey(func))
            _map[func]();
    }
}

用法:

Example example = new Example();
example.CallByString("A");

您有两个选择:要么使用反射。或者使用某种switch语句,越晚越快。

public void Fo()
{
    list <string> FuncsList=new list<string>();
    FuncsList.Add("F");
    FuncsList.Add("S");
    FuncsList.Add("TH");
    foreach(String name in FuncsList)
        CallNamedMethod(name);
}
private void CallNamedMethod(string name)
{
    switch(name)
    {
        case "F":
            F();
            return;
        case "S":
            S();
            return;
        case "TH":
            TH();
            return;
        default:
            throw new InvalidArgumentException();
    }
}

如果你有大量不同的方法可以调用,你可以创建一个带有名称和委托的字典。

祝你的任务好运。

调用它们所属的直接程序集 c# 无法知道它们的引用