开发者

References to methods C#

I'm just wondering if there is a C# equivilent for this python code. I want to store the names of methods in some sort of collection and call them later on. I have searched, but I really don't know what to look for.

For example in python I could do:

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

This is a silly example, but you should get the idea.


You are looking for delegates.

A delegate is a type that defines a method signature. When you instantiate a delegate, you can associate its instance with any method with a compatible signature. You can invoke (or call) the method through the delegate instance.

Your example in C#, using the 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"


Yes, you can use delegates. For this one use Func<int, int>. like:

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

and in main:

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

example on your code:

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
}

or use lambdas as suggested in comment:

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
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜