2009-05-01 5 views
1

ASP.NETアプリケーションでは、いくつかのコントロールをXMLドキュメントから入ってくるプロパティで動的にレンダリングしたいと思います。キッカーがあります:コントロールのタイプを動的に決定できるようにしたい。だから、私のXML文書で、私はこのようなものを持っている:動的レンダリングコントロールは、文字列/ XMLファイルから型を決定しますか?

<control> 
    <id>myControl1</id> 
    <type>CheckBox</type> 
    <text>Text For This Control</text> 
    </control> 

私は...私は手動でチェックボックスなどの新しいコントロールをインスタンス化して、すべてがそう長く、限り性質が行くように、細かい仕事を得ることができますが、私はそれをチェックボックス、テキストボックス、またはXML情報に基づくものと比較して調べることはできません。

答えて

4

おそらく、コントロールのタイプを超えて出力を制御できるようにしたいと思うでしょう。私の提案:

public interface IControlProvider { 
    public Control GetControl(XmlElement controlXml); 
}; 

public class ControlProviderFactory : IControlProvider { 
    private Dictionary<string,IControlProvider> providers = new Dictionary<string,IControlProvider>(); 

    public ControlProviderFactory() { 
     //Add concrete implementations of IControlProvider for each type 
    } 

    public Control GetControl(XmlElement controlXml) { 
     string type = (controlXml.SelectSingleNode("type") as XmlElement).InnerText; 
     if(!providers.ContainsKey(type) throw new Exception("No provider exists for " + type); 
     return providers[type].GetControl(controlXml); 
    } 
} 

また、非登録型に対するフォールバックとしてReflectionControlProviderを追加し、代わりに、未知のプロバイダ・タイプに遭遇したとき、例外を投げるのこの使用Activator.CreateInstanceを聞かせてことができます。これにより、レンダリングの特定のコントロールと動的な作成の両方に最大の柔軟性が得られます。

+1

+1素敵で柔軟な答え。しかし、私は時には力強いかもしれないと思う。 –

+0

約2ヶ月前、私は同意したでしょう。しかし、オープン・クローズの原理を満たすために、このようなコーディング・スタイルを使い始めたので、どうしてそんなことを構築しなかったのか分かりません。拡張するのは簡単で、コードを変更することによってコードを改ざんするリスクはありません。新しいプロバイダを追加するだけです。 –

+0

OKこれまでのところ、タイプを取得することはもはや問題ではありません...しかし、他のプロパティを割り当てることは、私の新しい問題になっているようです...?あなたはちょっとタイプを越えて出力を制御する能力をほんの少し示唆しました。あなたが私を正しい方向に向けるために与えることができる他のポインタ?これまでのご支援ありがとうございました。 –

1

有効なタイプのDictionary<string, Type>を作成するか、Activator.CreateInstanceという名前でインスタンスを作成できます。

関連する問題