2012-06-14 23 views
1

我需要通過反射爲屬性指定值,並且對於目前爲止測試的每個案例(除了類型爲System.Reflection.Missing的案例除外)都可以。例如,這是類:指定給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#中實現這種分配?

回答

0

錯誤消息非常明瞭 - Missing.Value只能用作具有可選參數的方法中的佔位符。你想要做什麼,在一個使用PropertyInfo設置實例值的方法中使用它,根本沒有意義,而Missing.Value知道這一點,所以它會拋出一個異常。

奇怪的是,你可能會得到這個使用VB.Net,因爲VB.Net支持默認參數。 C#沒有。

+0

如何在C#中實現這種分配? –

+0

很簡單,你不能。通過在任何方法中將Missing.Value作爲參數傳遞,您正在指示編譯器將「Missing.Value」替換爲該參數的默認值。因此,將Missing.Value作爲值參數傳遞給prop.SetValue會導致代碼失敗,因爲SetValue方法簽名中value參數沒有默認值。 –

相關問題