如何使用反射调用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 。
答案 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