2012-06-20 72 views
0

我正在測試原來的代碼中的邏輯,我無法輕鬆去編輯,但代碼所在的對象中有50多個對象是null無論出於何種原因我想要做的是:從我的測試代碼中,使用反射,遍歷我正在測試的類的所有內部對象,並且如果所述對象爲null,那麼只是實例化它。這是我迄今:使用反射來實例化對象內的控件屬性

Type ucApprovedType = ucApproved.GetType(); 
System.Reflection.FieldInfo[] fieldInfo = ucApprovedType.GetFields(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); 

foreach (System.Reflection.FieldInfo ucFieldInfo in fieldInfo) 
{ 
    Control control = ucApproved.FindControl(ucFieldInfo.Name); 

    if (control == null) 
     control = new Control(); 

    //Set instantiated control back to ucApproved item 
} 

我上面跑的第一個問題是,控制回來空從的FindControl(ucFieldInfo.Name)調用。然後,一旦我有了instatiated控件,我不知道如何將它的值設置回ucApproved對象,因爲我無法執行ucApproved.Controls[0] = control,因爲ControlCollection是隻讀的。

回答

0

你幾乎在那裏,但它更容易使用fieldInfo對象直接引用有問題的對象。試試這個:

Type ucApprovedType = ucApproved.GetType(); 
System.Reflection.FieldInfo[] fieldInfo = ucApprovedType.GetFields(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); 

foreach (System.Reflection.FieldInfo ucFieldInfo in fieldInfo) 
{ 
    //get its current value 
    Control control = ucFieldInfo.GetValue(ucApproved) as Control; 

    if (control == null) 
    { 
     control = new Control(); 

     //Set instantiated control back to ucApproved item 
     ucFieldInfo.SetValue(ucApproved, control); 
    } 
} 

警告 這真的只是工作方式是,如果你在這個循環中得到的唯一領域是Control領域。否則,你需要添加一個過濾器語句。

if (ucFieldInfo.FieldType.IsInstanceOfType(typeof(Control)) || ucFieldInfo.FieldType.IsSubclassOf(typeof(Control))) 

或類似的。

-------另一種選擇-----------

在假設ucApproved是一個自定義用戶控件,爲什麼不只是做內部的公共效用函數控制類將爲您實現控制。

是的,我可以看到你說「不容易去編輯」。我甚至理解這個概念。然而,它是更容易的答案。撥打ucApproved.CreateControls();將是一個更清潔的解決方案。

+0

這工作非常好! (符合不同類型的控件)非常感謝! – IWriteApps