2013-03-03 5 views
0

Возможно ли создать метод с динамическим числом параметра в C#?Создать метод, который имеет динамическое число параметров

Например

Public void sum(dynamic arguments//like JavaScript) 
{ 
    //loop at run-time on arguments and sum 
} 

Могу ли я использовать динамический объект?

+1

Вы ищете 'params'? bla (params int [] variableInts) – bas

+1

Как насчет этого: https://www.google.com/search?btnG = 1 & pws = 0 & q = method + with + dynamic + number + of + parameter + c% 23 – antonijn

+1

Это действительно помогло бы, если бы вы разместили пример того, как вы хотите * вызывать * метод. –

ответ

4

Используйте params keyword для достижения переменного числа аргументов можете.

Ключевое слово params позволяет указать параметр метода, который принимает переменное число аргументов . Вы можете отправить список разделенных запятыми аргументов типа, указанного в объявлении параметра, или массива аргументов указанного типа. Вы также можете отправить никакие аргументы .

Например: public void Sum(params int[] args){ }

Могу ли я использовать динамический объект?

Да, но, возможно, не так, как вы думаете.

// example 1 - single parameter of type dynamic 
private static void Sum(dynamic args) { } 

// will not compile; Sum() expects a single parameter whose type is not 
// known until runtime 
Sum(1, 2, 3, 4, 5); 

// example 2 - variable number of dynamically typed arguments 
private static void Sum(params dynamic[] args) { } 

// will compile 
Sum(1, 2, 3, 4, 5); 

Таким образом, вы могли бы иметь такой метод, как:

public static dynamic Sum(params dynamic[] args) { 

    dynamic sum = 0; 

    foreach(var arg in args){ 
     sum += arg; 
    } 

    return sum; 
} 

И называют это: Sum(1, 2, 3, 4.5, 5). DLR достаточно умен, чтобы вывести правильный тип из аргументов, а возвращаемое значение будет System.Double. Однако (по крайней мере, в случае метода Sum()), отказавшись от явного контроля над спецификацией типа и потерей типа безопасности, кажется плохой идеей.

Я предполагаю, что у вас есть причина не использовать Enumerable.Sum()

+0

Могу ли я использовать динамический? –

+0

'dynamic' используется, когда вы хотите подождать, пока среда выполнения не решит тип; Метод суммы означает, что вы * знаете тип. –

+0

'private static void Sum (params dynamic [] args)' будет компилироваться, если это то, что вы просите. –

2

Может быть, тестовый пример блок проясняет вещи немного:

[Test] 
    public void SumDynamics() 
    { 
     // note that we can specify as many ints as we like 
     Assert.AreEqual(8, Sum(3, 5)); // test passes 
     Assert.AreEqual(4, Sum(1, 1 , 1, 1)); // test passes 
     Assert.AreEqual(3, Sum(3)); // test passes 
    } 

    // Meaningless example but it's purpose is only to show that you can use dynamic 
    // as a parameter, and that you also can combine it with the params type. 
    public static dynamic Sum(params dynamic[] ints) 
    { 
     return ints.Sum(i => i); 
    } 

Имейте в виду, при использовании динамики, вы сообщаете ваш компилятор отступить , поэтому вы получите свои исключения во время выполнения.

[Test, ExpectedException(typeof(RuntimeBinderException))] 
    public void AssignDynamicIntAndStoreAsString() 
    { 
     dynamic i = 5; 
     string astring = i; // this will compile, but will throw a runtime exception 
    } 

Подробнее о dynamics.

Узнайте больше о params

Смежные вопросы