0

是否可以在 C# 中创建具有动态参数数量的方法?

例如

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

我可以使用动态对象吗?

4

3 回答 3

3

使用params关键字来实现可变数量的参数。

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()

于 2013-03-03T18:35:43.793 回答
1

是的,你可以看看这里

http://msdn.microsoft.com/library/w5zay9db(v=vs.80).aspx

params关键词)

于 2013-03-03T18:35:03.513 回答
1

也许一个示例单元测试可以稍微澄清一些事情:

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

阅读有关动态的更多信息。

阅读有关参数的更多信息

于 2013-03-03T19:00:18.980 回答