一个问题给大家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 []不是.如果这是真正的情况,一直给你的问题,然后看动态版本 – 这将在两种情况下工作.