加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 18:11:32 所属栏目:百科 来源:网络整理
导读:一个问题给大家C#向导.我有一个方法,称它为myFunc,它采用可变长度/类型的参数列表. myFunc本身的参数签名是myFunc(params object [] args),我在列表中使用反射(例如,想像这样的printf). 我想要处理myFunc(1,2,3)与myFunc(new int [] {1,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 []不是.如果这是真正的情况,一直给你的问题,然后看动态版本 – 这将在两种情况下工作.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读