首页 > 解决方案 > Delegate.DynamicInvoke 不能使用可选参数?

问题描述

请看这段代码:

// this method have a optional parameter
public static void Foo(int a = 3) { }

var del = new Action<int>(Foo);

// pass Type.Missing
del.DynamicInvoke(Type.Missing);

// or
del.DynamicInvoke(new object[] { Type.Missing });

它会得到异常System.ArgumentException

System.ArgumentException: Missing parameter does not have a default value.
Parameter name: parameters
   at System.Reflection.MethodBase.CheckArguments(Object[] parameters, Binder binder, BindingFlags invokeAttr, CultureInfo culture, Signature sig)
   at System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at System.Delegate.DynamicInvokeImpl(Object[] args)
   at xxx.btnSetting_Click(Object sender, EventArgs e) in xxx\FmMain.cs:line 106

请帮忙。

标签: c#.netreflectiondelegates

解决方案


我猜想使用 of 的问题Action<int>似乎不支持可选参数的动态调用。这个样本工作正常

// this method have a optional parameter
public static void Foo(int a = 3) { }

delegate void SampleDelegate(int a = 3);

static void Main(string[] args)
{
    SampleDelegate del = Foo;
    // pass Type.Missing
    del.DynamicInvoke(Type.Missing);
}

推荐阅读