簡體   English   中英

如何在C#中從特殊函數(僅使用其字符串名稱)中調用類中的其他函數?

[英]How Can i call other functions in a class from special function(Just with their string names) in C#?

我有一個名為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  
}

我最初使用了Reflection ...,但是我為類中的公共變量分配了一些值。當Reflection成為新實例時,我所有在公共變量中的數據都丟失了。

是否有任何特殊原因,您需要將它們存儲為字符串。 如果它們都是同一類中的無參數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/zh-cn/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#的Call Direct程序集不知道它們的引用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM