2009-08-25 9 views

答えて

31

これは

public class Control1<T> : UserControl { ... } 

public class Control2 : Control1<double> { ... } 

public class Control3 : Control2 { ... } 

作品ここでそれを読んでいた:あなたはそれを試したとき

http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/0c265543-d6f0-41f6-beeb-b89e0071c5c3

+2

+1実際に私が提案したのと同じ解決策ですが、もっときれいに説明しました。 –

+0

うん、それは動作し、それは私が探していたものでした。 – Toto

+0

Control3は別のファイルで作成してください。 –

1

デザイナーを使用できるようにするためにコントロールが実行できる操作と実行できない操作にはいくつかの制限があります。基本的には、それらはすべてデザイナーがクラスをインスタンス化できるようになっています(パラメーターのないコンストラクターを持つ必要があります。abstractなどはできません)。設計者は、どのような型を汎用引数として渡すべきかわからないので(これは考慮すべきではないと思われます)、クラスをインスタンス化することはできません。

UserControlを作成し、コンストラクタをprotectedに変更することをお勧めします(これは、デザイナーがリフレクションを使用して可視性を無視するため動作しますが、100%正ではありません)。その後、UserControlから継承し、汎用クラスを作成し、ベース(protected)コンストラクタを呼び出します。

0

デザイナーがクラスのインスタンスを呼び出すため、これは可能ではないと思います。ジェネリックを使用する場合、設計者はどのタイプを 'T'に渡すべきかを知りません。

8

私たちのプロジェクトでよく似ています。

一般的なものであり、基本クラスがあります:

public class controlMessagesNonGenericParent : controlItemList<MailItem, MailItemCollection> 
{ 
} 

public partial class controlItemList<TBaseItem, TBaseItemCollection> : UserControl, IUIDispatcher 
    where TBaseItem : new() 
    where TBaseItemCollection : IItemCollection<TBaseItem> 

が次に使用するたびに、我々は(まだデザイナーが使用することができませんでした)非ジェネリックバージョンを定義

。私たちはデザイナーで使用できるコントロールを派生させました:

+1

あなたは逆の方向に行っているようです。あなたは一般的な基盤を持ち、デザイナーの具体的な具体的な実装を作成しています。彼はジェネリックコントロールを作成してデザインしたいと思うようです。 –

+1

あなたは正しいですが、コントロールとしてジェネリッククラスを直接使用することは不可能です。だから私たちはそれをサブクラス化するので、デザイナーで使うことができます。サブクラス化されたバージョンが動作を変更するという事実はここでは無関係です。 –

+1

そうですね、それは不可能ですが、彼の問題に対処するようには見えません。これは彼が問題を回避することができる "ハック"ではありません。実際、ソリューションは他の方向に向いているように見えます(一般的ではなく、デザインを行い、次にサブクラス化して一般的にする)。私はこれがどのように解決するのか分かりません。 –

0

https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=105876

このバグはマイクロソフトのサイトに投稿されています。現在のところ、「延期済み」とマークされていますが、解決策はありません。 。

+0

実際には「バグ」のようには見えませんが、ジェネリックを使用した結果です。おそらく、彼らはあなたが提供されるタイプを選択することを可能にする将来の拡張を提供することができますが、私はそれを "バグ"として分類しません。 –

0

ジェネリックスの代わりに構図を使用します。 ObjectSelectorControlを使用する代わりに、別のタイプの汎用メンバ(Selector<T>かもしれません)を与えて、自分自身を汎用的にするのではなく、そのオブジェクトに対して動作させます。

+1

私は間違っているかもしれませんが、UserControlの中でコンポジションを使用する場合は、a)ジェネリックアトリビュートのタイプを指定する必要があります。b)ジェネリッククラスもジェネリッククラスにする必要があります。 –

+0

合成はジェネリックの代替技術ではありません。おそらく、WinFormsをジェネリックスで動作させるための解決策が考えられます。その場合は、答えがどんな方向性を示すものではありません。 – MarioDS

関連する問題