【问题标题】:Delegate.DynamicInvoke can't use optional parameter?Delegate.DynamicInvoke 不能使用可选参数?
【发布时间】:2019-12-07 14:08:04
【问题描述】:

请看这段代码:

// 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

请帮忙。

【问题讨论】:

  • @thehennyyHmmm,不是真的,那个问题是关于匹配委托和方法的,这个问题是关于执行问题的。请取消重复标志,谢谢。
  • 即使问题不同,链接的答案也能解释情况。
  • @thehennyy我不这么认为,这个问题是关于DynamicInvoke的,没有答案的说吧。

标签: c# .net reflection delegates


【解决方案1】:

我猜想Action&lt;int&gt; 的使用问题,好像它不支持可选参数的动态调用。此示例运行良好

// 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);
}

【讨论】:

  • 谢谢,但它会导致方法的defaultValue被忽略,我认为这是一个关于DynamicInvoke的错误,所以令人沮丧。
猜你喜欢
  • 2010-12-12
  • 2018-07-26
  • 2013-06-07
  • 1970-01-01
  • 2016-11-19
  • 2012-08-24
  • 1970-01-01
  • 2012-10-29
  • 2011-04-26
相关资源
最近更新 更多