簡體   English   中英

參考方法 C#

[英]References to methods C#

我只是想知道這個 python 代碼是否有一個 C# 等效項。 我想將方法的名稱存儲在某種集合中,然后再調用它們。 我已經搜索過,但我真的不知道要尋找什么。

例如在 python 我可以這樣做:

def add_one(x):
  return x + 1
def double_it(x):
  return x*2

maths_rules = [add_one, double_it]
def do_maths(maths_rules, x):
  for func in maths_rules:
    x = func(x)
  return x

print do_maths(maths_rules, 9)
# >>> 20

這是一個愚蠢的例子,但你應該明白這一點。

您正在尋找代表

委托是一種定義方法簽名的類型。 實例化委托時,可以將其實例與具有兼容簽名的任何方法相關聯。 您可以通過委托實例調用(或調用)該方法。

您在 C# 中的示例,使用Func<T, TResult> Delegate

int add_one(int x) { return x + 1; }
int double_it(int x) { return x * 2; }

var maths_rules = new List<Func<int,int>> { add_one, double_it };

int do_maths(IEnumerable<Func<int,int>> maths_rules, int x)
{
    foreach (var func in maths_rules)
    {
        x = func(x);
    }
    return x;
}

Console.WriteLine(do_maths(maths_rules, 9));
// prints "20"

是的,您可以使用委托。 為此,請使用Func<int, int> 喜歡:

int addone(int x)
{
    return x + 1;
}

主要是:

Func<int, int> myFunc = new Func<int, int>(addone);
myFunc(5); // to use it, you can pass it as you like

您的代碼示例:

static int add_one(int x)
{
    return x + 1;
}
static int double_it(int x)
{
    return x * 2;
}
static int do_maths(List<Func<int, int>> math_rules, int x)
{
    foreach(var func in math_rules)
        x = func(x);
    return x;
}
static void Main(string[] Args)
{
    List<Func<int, int>> math_rules = new List<Func<int, int>>();
    math_rules.Add(new Func<int, int>(add_one));
    math_rules.Add(new Func<int, int>(double_it));
    Console.WriteLine(do_maths(math_rules, 9)); // 20
}

或按照評論中的建議使用 lambda:

static int do_maths(List<Func<int, int>> math_rules, int x)
{
    foreach(var func in math_rules)
        x = func(x);
    return x;
}
static void Main(string[] Args)
{
    List<Func<int, int>> math_rules = new List<Func<int, int>>();
    math_rules.Add(new Func<int, int>((x) => (x + 1)));
    math_rules.Add(new Func<int, int>((x) => (x * 2)));
    Console.WriteLine(do_maths(math_rules, 9)); // 20
}

暫無
暫無

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

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