Is there a way to distingish myFunc(1, 2, 3) from myFunc(new int[] { 1, 2, 3 })?

后端 未结 6 1632
暖寄归人
暖寄归人 2020-12-11 03:08

A question to all of you C# wizards. I have a method, call it myFunc, and it takes variable length/type argument lists. The argument signature of myFunc itself is my

6条回答
  •  孤城傲影
    2020-12-11 03:53

    Well this will do it:

    using System;
    
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("First call");
            Foo(1, 2, 3);
            Console.WriteLine("Second call");
            Foo(new int[] { 1, 2, 3 });
        }
    
        static void Foo(params object[] values)
        {
            foreach (object x in values)
            {
                Console.WriteLine(x.GetType().Name);
            }
        }
    }
    

    Alternatively, if you use DynamicObject you can use dynamic typing to achieve a similar result:

    using System;
    using System.Dynamic;
    
    class Program
    {
        static void Main(string[] args)
        {
            dynamic d = new ArgumentDumper();
            Console.WriteLine("First call");
            d.Foo(1, 2, 3);
            Console.WriteLine("Second call");
            d.Bar(new int[] { 1, 2, 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;
        }
    }
    

    Output of both programs:

    First call
    Int32
    Int32
    Int32
    Second call
    Int32[]
    

    Now given the output above, it's not clear where your question has really come from... although if you'd given Foo("1", "2", "3") vs Foo(new string[] { "1", "2", "3" }) then that would be a different matter - because string[] is compatible with object[], but int[] isn't. If that's the real situation which has been giving you problems, then look at the dynamic version - which will work in both cases.

提交回复
热议问题