对方法C#的引用

时间:2011-06-01 02:13:31

标签: c# python functional-programming

我只是想知道这个python代码是否存在C#equivilent。 我想将方法​​的名称存储在某种集合中,稍后再调用它们。我搜索过,但我真的不知道该找什么。

例如在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

这是一个愚蠢的例子,但你应该明白这一点。

2 个答案:

答案 0 :(得分:7)

您正在寻找delegates

  

委托是定义方法签名的类型。实例化委托时,可以将其实例与具有兼容签名的任何方法相关联。你可以调用   (或调用)通过委托实例的方法。

您在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"

答案 1 :(得分:4)

是的,你可以使用代表。对于这一个使用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
}

或使用评论中建议的lambdas:

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
}