通过反射分配System.Reflection.Missing类型的属性会引发异常

时间:2012-06-14 15:09:47

标签: c# .net reflection properties

我需要通过反射为属性赋值,并且到目前为止测试的每个案例都可以,除了类型为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#中实现这种分配?

1 个答案:

答案 0 :(得分:0)

错误消息非常明显 - Missing.Value只能用作具有可选参数的方法中的占位符。你想要做的是在一个方法中使用它来使用PropertyInfo来设置实例的值,这根本没有意义,而且Missing.Value知道这一点,所以它抛出一个异常。

奇怪的是,你可能会使用VB.Net来使用它,因为VB.Net支持默认参数。 C#没有。