4

手始めに、誰かが質問の名前をもう少し良くするのを手伝ってくれるかもしれません。

私が達成しようとしていること:

以下は、私が達成しようとしていることの非常に簡単な例です。基本的な作業部分のみを使用して、探しているソリューションを導き出すことができます。

.ascx.cs 分離コードで次のファイルを作成できるようにしたいと考えています。

public partial class DynamicControl<T> : System.Web.UI.UserControl where T : class
{
    public List<T> Items;

    public void Add(T item) {
        Items.Add(item);
    }
}

.ascx ファイル内でこれを適切に参照します。

<% foreach (var item in Items) { %>
    <p>item.Name</p>
<% } %>

そして、これを次のようなタグで .aspx ファイルにロードします。

<custom:DynamicControl ID="DynamicControl1" ItemType="Person" runat="server" />

または、.aspx.cs コードビハインドでも次のようになります。

DynamicControl1.ItemType = Type.GetType("Person");

本当に、可能なことは何でも。

項目タイプをプログラムで (またはタグで) 設定し、.ascx.cs ファイルと .ascx ファイルの両方、および参照元の .aspx ファイルを操作できる、Web サイト全体で汎用ユーザー コントロールを作成する方法が必要です。 .

私が試したこと:

1) を作成しDynamicControlBuilderてクラスを継承し、ControlBuilderを使用してこれを属性としてアタッチします[ControlBuilder(typeof(DynamicControlBuilder))]。その結果、コントロールがジェネリック型を .aspx.designer.cs ファイルに追加せず、.ascx ファイルがレンダリング方法を認識できなくなりました。

2)ジェネリック型を使用するクラスの内部プロパティを作成しますDynamicControlが、デフォルトメンバーがそのようなものであるか、それらの線に沿ったものであるという良い解決策を見つけることができませんでしたDynamicControl<dynamic>-明らかにオブジェクトはその時点で互換性がないためですオートコンプリートやコンパイル時のエラー処理はありません。

3)Add<T>(T item) where T : classたとえば、現在私がやっていることのようなことをするメソッドを使用しています...しかし、単一のコントロールに大量のアイテムを追加したい場合、これは醜くなります。開発者が毎回すべてのメソッドの型を再宣言する必要はありません。また、List<T> Itemsそこにあるという問題も解決しません。つまり、その端からオートコンプリートが得られないことを意味します。これも醜いです。

前もって感謝します!

4

1 に答える 1