簡體   English   中英

使用反射實例化對象內部的控件屬性

[英]Using reflection to instantiate control properties inside an object

我正在測試無法輕松進行編輯的現有代碼中的邏輯,但是由於任何原因,代碼所在的對象中都有50多個對象為空。 我想要做的是:從我的測試代碼中,使用反射,遍歷我正在測試的類的所有內部對象,如果所述對象為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)調用返回了null。 然后,一旦有了實例化的控件,我就不知道如何將其值重新設置到ucApproved對象中,因為我無法執行ucApproved.Controls[0] = control因為ControlCollection是只讀的。

您已經差不多了,但是直接使用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(); 將是一個更清潔的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM