1

フィールド名とプロパティ名を見て、コントロールの値を設定しようとすることで、リフレクションを介してオブジェクトをページにマップするシステムを設計しています。問題は、システムが完了するまでに膨大な時間がかかることです。誰かがこれを少しスピードアップするのを手伝ってくれることを願っています

public static void MapObjectToPage(this object obj, Control parent) {
    Type type = obj.GetType();
    foreach(PropertyInfo info in type.GetProperties(BindingFlags.Public | BindingFlags.Instance)){
        foreach (Control c in parent.Controls ) {
            if (c.ClientID.ToLower() == info.Name.ToLower()) {
                if (c.GetType() == typeof(TextBox) && info.GetValue(obj, null) != null)
                {
                    ((TextBox)c).Text = info.GetValue(obj, null).ToString();
                }
                else if (c.GetType() == typeof(HtmlInputText) && info.GetValue(obj, null) != null)
                {
                    ((HtmlInputText)c).Value = info.GetValue(obj, null).ToString();
                }
                else if (c.GetType() == typeof(HtmlTextArea) && info.GetValue(obj, null) != null)
                {
                    ((HtmlTextArea)c).Value = info.GetValue(obj, null).ToString();
                }
                //removed control types to make easier to read
            }
        // Now we need to call itself (recursive) because
        // all items (Panel, GroupBox, etc) is a container
        // so we need to check all containers for any
        // other controls
            if (c.HasControls())
            {
                obj.MapObjectToPage(c);
            }
        }
    }
}

私はこれを手動で行うことができることを認識しています

textbox.Text = obj.Property;

ただし、これは、手動で値を設定しなくてもオブジェクトをページにマップできるようにするという目的を無効にします。

私が特定した 2 つの主要なボトルネックは foreach ループです。各コントロール/プロパティをループし、一部のオブジェクトには 20 ほどのプロパティがあります。

4

1 に答える 1

3

N*M をループする代わりに、プロパティを 1 回ループし、それらをディクショナリに入れ、コントロールのループ中にそのディクショナリを使用します。

于 2013-06-06T14:14:49.460 に答える