0

簡単に移動して編集できない既存のコードのロジックをテストしていますが、コードが存在するオブジェクトには、何らかの理由でnullである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.Controls[0] = control次に、インスタンス化されたコントロールを取得すると、ControlCollectionが読み取り専用であるために設定できないため、その値をucApprovedオブジェクトに戻す方法がわかりません。

4

1 に答える 1

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();ことは、はるかにクリーンなソリューションになります。

于 2012-06-20T16:48:55.833 に答える