c# – 有没有办法从myFunc(new int [] {1,2,3})中调用myFunc(1,2,3)?

一个问题给大家C#向导.我有一个方法,称它为myFunc,它采用可变长度/类型的参数列表. myFunc本身的参数签名是myFunc(params object [] args),我在列表中使用反射(例如,想像这样的printf).

我想要处理myFunc(1,2,3)与myFunc(new int [] {1,3})的不同.也就是说,在myFunc的内部,我想枚举我的参数的类型,并且最终得到{int,int,int}而不是int [].现在我得到后者:实际上,我无法区分这两种情况,他们都以int []形式出现.

我希望前者会显示为obs [].Length = 3,obs [0] = 1等

我曾经期望后者显示为obs [].Length = 1,obs [0] = {int [3]}

这可以做到吗,还是我问不可能?

解决方法

这样做会是这样的:
using System;

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("First call");
        Foo(1,3);
        Console.WriteLine("Second call");
        Foo(new int[] { 1,3 });
    }

    static void Foo(params object[] values)
    {
        foreach (object x in values)
        {
            Console.WriteLine(x.GetType().Name);
        }
    }
}

或者,如果您使用DynamicObject,您可以使用动态类型来实现类似的结果:

using System;
using System.Dynamic;

class Program
{
    static void Main(string[] args)
    {
        dynamic d = new ArgumentDumper();
        Console.WriteLine("First call");
        d.Foo(1,3);
        Console.WriteLine("Second call");
        d.Bar(new int[] { 1,3 });
    }
}

class ArgumentDumper : DynamicObject
{
    public override bool TryInvokeMember
        (InvokeMemberBinder binder,Object[] args,out Object result)
    {
        result = null;
        foreach (object x in args)
        {
            Console.WriteLine(x.GetType().Name);
        }
        return true;
    }
}

两个方案的产出:

First call
Int32
Int32
Int32
Second call
Int32[]

现在给出上面的输出,不清楚你的问题是否真的来自…虽然如果你给了Foo(“1”,“2”,“3”)vs Foo(new string [] {“1”,“3”}),那么这将是一个不同的事情 – 因为string []与object []兼容,而int []不是.如果这是真正的情况,一直给你的问题,然后看动态版本 – 这将在两种情况下工作.

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...