调用varargs方法

时间:2014-12-05 16:01:41

标签: c# .net reflection variadic-functions

如何使用反射调用varargs方法?像这样:

public static void ArgsMethod(__arglist)
{
    ArgIterator ai = new ArgIterator(__arglist);
    while(ai.GetRemainingCount() > 0)
    {
        Console.WriteLine(TypedReference.ToObject(ai.GetNextArg()));
    }
}

typeof(Program).GetMethod("ArgsMethod").Invoke(null,new object[0])抛出 NotSupportedException

2 个答案:

答案 0 :(得分:4)

由于RuntimeMethodInfo根本不支持这种情况(如果方法的调用约定是VarArgs,它会显式检查并抛出),你必须编写一个包含常规Object[]的包装器。 1}},生成用于调用方法的IL,并调用它。 ILGenerator 通过EmitCall 支持varargs-methods。 MSDN甚至可以提供a sample that demonstrates this exact scenario

当然,它并不完全是方便,但真的没有关于varargs的内容。

答案 1 :(得分:2)

我不确定你想要什么,但这对我有用;

class Program
    {
        public static void ArgsMethod(params object[] args) 
        {
            foreach (var par in args)
             {
                 Console.WriteLine("variable has type: " + par.GetType() );

             }
        }

        static void Main(string[] args)
        {
            Type[] types = new Type[1];
            types[0] = typeof(object[]);
            MethodInfo m = typeof(Program).GetMethod("ArgsMethod", types);
            object[] parameters = new Object[1];
            parameters[0] = args;
            m.Invoke(null, parameters);
        }
    }

params__arglist不是一回事,但如果你在c#中开发一个方法,最好使用params。

请参阅http://bartdesmet.net/blogs/bart/archive/2006/09/28/4473.aspx