【问题标题】:Assigning to a property of type System.Reflection.Missing through reflection raises exception通过反射分配给 System.Reflection.Missing 类型的属性会引发异常
【发布时间】:2012-06-17 15:54:06
【问题描述】:

我需要通过反射为属性赋值,到目前为止测试的每个案例都可以,除了System.Reflection.Missing类型的案例。例如这是类:

public class SomeClass
{
    public System.Reflection.Missing MissingProp { get; set; }
}

这是通过反射分配给属性的代码:

var inst = new SomeClass();
var prop = typeof (SomeClass).GetProperty("MissingProp");
prop.SetValue(inst, Missing.Value, null);

这是我收到的例外情况:

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.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at System.Reflection.RuntimePropertyInfo.SetValue(Object obj, Object value, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture)
   at System.Reflection.RuntimePropertyInfo.SetValue(Object obj, Object value, Object[] index)
   at ClassesWithNoProperties.Program.Main(String[] args) in D:\Documents\Documents\Visual Studio 2010\Projects\C#\ClassesWithNoProperties\ClassesWithNoProperties\Program.cs:line 24

我测试了我的库有太多使用相同代码为属性赋值的案例,这是我观察到这种行为的唯一案例 (System.Reflection.Missing)。

如何在 C# 中实现这种赋值?

【问题讨论】:

    标签: c# .net reflection properties


    【解决方案1】:

    错误消息是不言自明的 - Missing.Value 只能用作具有可选参数的方法中的占位符。您正在尝试做的事情,在方法中使用它来使用 PropertyInfo 设置实例的值,这根本没有意义,而 Missing.Value 知道这一点,所以它会引发异常。

    奇怪的是,您可能会使用 VB.Net 来实现这一点,因为 VB.Net 支持默认参数。 C# 没有。

    【讨论】:

    • 如何在 C# 中实现这种赋值?
    • 很简单,你不能。通过在任何方法中将 Missing.Value 作为参数传递,您将指示编译器将“Missing.Value”替换为该参数的默认值。因此,在对 prop.SetValue 的调用中将 Missing.Value 作为 value 参数传递会导致代码失败,因为 SetValue 方法签名中的 value 参数没有默认值。
    猜你喜欢
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多