Ссылки на методы C # - PullRequest
       5

Ссылки на методы C #

3 голосов
/ 01 июня 2011

Мне просто интересно, существует ли C # -эквивалент для этого кода Python. Я хочу сохранить имена методов в какой-то коллекции и вызвать их позже. Я искал, но я действительно не знаю, что искать.

Например, в 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 ]

7 голосов
/ 01 июня 2011

Вы ищете делегатов .

Делегат - это тип, который определяет сигнатуру метода.Когда вы создаете экземпляр делегата, вы можете связать его экземпляр с любым методом с совместимой подписью.Вы можете вызывать (или вызывать) метод через экземпляр делегата.

Ваш пример в C #, используя функцию Делегат :

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"
4 голосов
/ 01 июня 2011

Да, вы можете использовать делегатов.Для этого используйте 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
}

или используйте лямбда-выражения, как предложено в комментарии:

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...