2009-03-24 12 views
33

私はWinフォームユーザーコントロールのための一般的な基本クラスを作成しました:Winフォームユーザーコントロールのためのジェネリック基底クラス

public partial class BaseUserControl<T> : UserControl 
{ 
    public virtual void MyMethod<T>() 
    { 
     // some base stuff here 
    } 
} 

そして、それに基づいてユーザーコントロール:

public partial class MyControl : BaseUserControl<SomeClass> 
{ 
    public override void MyMethod<SomeClass>() 
    { 
     // some specific stuff here 
     base.MyMethod<SomeClass>(); 
    } 
} 

それは正常に動作しますが、MyControlとは編集することができませんVisualStudioデザイナーでは、基本クラスを読み込むことができないと言われています。 私は別のクラスBaseUserControlを定義しようとしましたが、ジェネリックではありません。ロードしたいと思っていますが、トリックは機能していないようです。

私はすでに回避策を持っている:インターフェイスを定義し、IMyInterfaceという<T>、その後、

public partial class MyControl : UserControl, IMyInterface<SomeClass> 

としての私のコントロールを作成します。しかし、私は私のベースの仮想メソッド(ではない大したことが、それでも負け... )。

UserControlの基本ジェネリッククラスを作成する方法はありますか?VisualStudioデザイナでそれを編集する可能性はありますか?

+0

でそれに投票してください、 はそれからではなく継承の実装者クラスが含まれています。 – Robocide

答えて

34

私たちは同じことをやっています。最初にクラスを特化し、特殊クラスから派生させて取り組んでいます。 あなたの例からコードを使用すると、このようなものを意味します

public partial class UserControl : UserControlDesignable 
{ 

... 
} 
public class UserControlDesignable : BaseUserControl<Someclass> { } 

を設計者が、まだ時々サクサク動作している - しかし、それが動作するほとんどの時間。

+0

回避策として、これは余分なファイルでなければならないことに注意してください。ベースが抽象的で、カスタムタイプのプロバイダ属性を使用している場合(このサイトの他の投稿に記載されているように)、それぞれのクラスに行く必要があります。 –

+0

VS2015の唯一の実用的なソリューションです。 MSによってネイティブサポートが追加されていません...:-( –

14

ジェネリックベースフォームから継承する「通常の」クラスを追加することで、デザイナーを騙す必要があります。 あなたの設計可能なフォームは、このクラスから継承する必要があります。 したがって、次の2つのクラス定義は同じファイルにあります。ジェネリックベースのユーザーコントロールから継承するクラスがファイルの最後のクラスであることを確認する必要があります。

public MyForm : EditableCustomerForm 
{} 

public EditableCustomerForm : GenericForm<Customer> 
{} 

デザイナーは、コードファイルに最初のクラスを表示します。

+0

素晴らしいアイデアですが、デザイナーが使用できるようになる前に基本クラスを既にコンパイルしておく必要があるので、EditableCustomerFormクラスを変更すると、デザイナーが影響を受けるように再構築する必要があります。デザイナーはおそらくMyFormクラスでのみ動作します –

3

これはVisual Studioのバグであるようです。フレームワークに掘って

は(実際にCodeDomSerializerから派生したカスタムタイプでRootDesignerSerializerを追加し、serialize方法をオーバーライドすることで)、私はVSコードドムプロバイダが実際に間違ったジェネリッククラスを解析し、代わりにされていることを証明することができましたジェネリッククラスとして考えてみるとという名前の普通のクラスであると考えていますが、Type.GetType()はもちろん見つかりません。

私はまだそれを回避する方法を探していますが、その間に上記のソリューションを使用することができます。その上Microsoft.Connectのバグレポートがあり

、お使いのベース仮想メソッドを失うする必要があなたはいけないhttps://connect.microsoft.com/VisualStudio/feedback/details/797279/win-forms-designer-error-when-inheriting-from-a-generic-form

関連する問題