11

一般的な機能とコントロールを保持する基本的なWindows フォーム フォームを作成しようとしていますが、メソッドの型を必要とするクラスへの参照も保持しています。各フォームは異なるタイプを表すため、次のように何かを行うことができると考えました。

public partial class Base<T> : Form where T : BaseClass
{
    private GenericHandler handler = new GenericHandler();
}

public class BaseClass { }

public class GenericHandler
{
    public void DoSomethingWithInstance<T>(T instance) where T : BaseClass
    {

    }
}

デザイナー クラスの宣言も、フォームの内容を反映しています。type を表す 2 番目のフォームを実行すると、次のFooエラーが発生するため、デザイナーにアクセスできません。

このファイル内のクラスを設計できないため、デザイナーを表示できませんでした。デザイナーは、ファイル内の次のクラスを検査しました: Foo --- 基本クラス 'WindowsFormsApplication1.Base' を読み込めませんでした。アセンブリが参照され、すべてのプロジェクトがビルドされていることを確認してください。

FooClass --- 基本クラス 'WindowsFormsApplication1.BaseClass' を設計できません。

public partial class Foo : Base<FooClass>
{
    public Foo()
    {
        InitializeComponent();
    }
}

public class FooClass : BaseClass { }

なぜこれが起こるのですか/私は何を間違っていますか、またはこれを行う他の方法はありますか?

4

1 に答える 1

16

WindowsフォームまたはユーザーUserControlがデザイナに読み込まれると、基本的にデザイナは基本クラス(カスタムフォームまたはコントロールが直接派生するクラス)のインスタンスを作成し、InitializeComponents()リフレクションを介して手動/明示的にメソッドを実行してビルドしますコントロールの意図したデザインをアップします。

ただし、あなたの場合、ジェネリックパラメータがあるため、基本クラスのインスタンスを作成することはできません。フォームまたはコントロールの基本クラスが抽象であるか、デフォルトのコンストラクターがない場合も、同じことが起こります。そのような場合、デザイナーは基本クラスのインスタンスを作成することもできません。

TypeDescriptionProviderAttributeを使用してこれを回避する方法があり、代わりにインスタンス化する必要がある置換クラスをデザイナに与えることができます。

于 2012-11-12T14:41:12.250 に答える