2013-10-03 86 views
1

我正在使用反射從反射屬性中設置屬性。我不得不使用反射,因爲我不知道子類型會是什麼類型,但是每次我得到System.Target.TargetException(在prop.SetValue上)時,prop都指向正確的屬性SetValue內反射的ProperyInfo

我可以找到很多的的SetValue的例子,是我遇到的問題,是我希望相關的事實,selectSubProcess是的PropertyInfo,而不是實際的類

PropertyInfo selectedSubProcess = process.GetProperty(e.ChangedItem.Parent.Label); 
Type subType = selectedSubProcess.PropertyType; 
PropertyInfo prop = subType.GetProperty(e.ChangedItem.Label + "Specified"); 
if (prop != null) 
     { 
      prop.SetValue(process, true, null); 
     } 

回答

1

看起來過程是「類型」,而不是對象的實例。在線

prop.SetValue(process, true, null); 

你需要一個對象的實例來設置,而不是一個類型。

使用「的GetValue」,讓你關心的對象的實例:

public void test() 
{ 
    A originalProcess = new A(); 
    originalProcess.subProcess.someBoolean = false; 

    Type originalProcessType = originalProcess.GetType(); 
    PropertyInfo selectedSubProcess = originalProcessType.GetProperty("subProcess"); 
    object subProcess = selectedSubProcess.GetValue(originalProcess, null); 
    Type subType = selectedSubProcess.PropertyType; 
    PropertyInfo prop = subType.GetProperty("someBoolean"); 
    if (prop != null) 
    { 
    prop.SetValue(subProcess, true, null); 
    } 

    MessageBox.Show(originalProcess.subProcess.someBoolean.ToString()); 
} 


public class A 
{ 
    private B pSubProcess = new B(); 
    public B subProcess 
    { 
    get 
    { 
     return pSubProcess; 
    } 
    set 
    { 
     pSubProcess = value; 
    } 
    } 

} 

public class B 
{ 
    private bool pSomeBoolean = false; 
    public bool someBoolean 
    { 
    get 
    { 
     return pSomeBoolean; 
    } 
    set 
    { 
     pSomeBoolean = true; 
    } 
    } 
} 
+0

有麻煩一點點轉換你的代碼,我的GetValue和的SetValue需要一個額外的參數,當我讓他們到空......我得到和以前一樣的錯誤 – spacemonkeys

+0

你在運行什麼.Net版本? – MikeH

+0

代碼已被更新爲.Net 2.0,但唯一的變化是添加空參數,這聽起來像你已經完成。你能否讓我的代碼按原樣工作(即不要試圖將它轉換爲你的結構)? – MikeH