0

我有一个名为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  
}

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

4

5 回答 5

3

是否有任何特殊原因,您需要将它们存储为字符串。如果它们都是同一类中的无参数 void 方法,则可以将它们存储为Actions

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();
}
于 2013-09-19T12:49:20.700 回答
1

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

于 2013-09-19T12:52:29.100 回答
0

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

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");
于 2013-09-19T12:51:34.470 回答
0

你有两个选择:要么使用反射。或者使用某种 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();
    }
}

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

祝你的任务好运。

于 2013-09-19T12:52:40.507 回答
-1

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

于 2013-09-19T13:00:13.123 回答