4

私は基本クラスを持っています

internal partial class View<T> : UserControl
  where T : class
{
    protected T t;
}

Viewから子を派生させたい

internal partial class ViewChild<T> : View<T>
  where T : class
{
}

問題なく動作しますが、VS デザイナーで ViewChild を編集できません。問題はジェネリック基本クラスであることはわかっています。ただし、この場合、それを回避する方法がわかりません。それを修正する方法はありますか?

4

2 に答える 2

3

別の方法があり、コンパイラフラグに依存しません。

http://wonkitect.wordpress.com/2008/06/20/using-visual-studio-whidbey-to-design-abstract-forms/

条件付きコンパイルの使用はお勧めしません。フレームワークに反対するのではなく、フレームワークを使用する方がはるかに優れています。

基本的に、既存のフレームワークを介してVSに別のクラスを与えることができます。基本クラスを、デザイナーとして別のクラスを使用するようにVSに指示するTypeDescriptionProvider属性で装飾します。

元のブログ投稿で述べたように、この回避策に関連する警告があるかもしれませんが、共通の基本クラスから継承する25を超えるUserControlsを持つプロジェクトでうまく機能するようになりました。

于 2012-04-18T08:16:05.433 に答える
2

ジェネリックは、型なしでクラスをインスタンス化できないため、デザイナーを壊しますT。ブログ投稿で回避策を説明しています。

http://adamhouldsworth.blogspot.co.uk/2010/02/winforms-visual-inheritance-limitations.html

つまり、中間クラスで型を「解決」する必要があります。

  • BaseControl<T> : UserControl
  • CustomerControl_Design : BaseControl<Customer>
  • CustomerControl : CustomerControl_Design

DEBUG次に、またはRELEASEコンパイラ スイッチに基づいて、コードからこのクラスを条件付きで切り替えることができます。

#if DEBUG

namespace MyNamespace
{
    using System;


    public partial class CustomerEditorControl_Design : BaseEditorControl<Customer>
    {
        public CustomerEditorControl_Design()
            : base()
        {
            InitializeComponent();
        }
    }
}

#endif

    public partial class CustomerEditorControl
#if DEBUG
        : CustomerEditorControl_Design
#else
        : BaseEditorControl<Customer>
#endif
    {
    }

これにより、 の派生クラスを開くことCustomerControlができますが、残念ながら、シグネチャにジェネリックを含む UI コントロールを設計することはできません。私の解決策は、派生アイテムの設計のみを有効にすることです。

CustomerControl : BaseControl<Customer>この場合、型が定義されているため、なぜ機能しないのTかわかりませんが、単純に機能しません-一般的な使用法の規則のために推測しています。

彼らの弁護のために、マイクロソフトはこれがサポートされていないと言っています.

于 2012-04-18T08:08:43.830 に答える