4

次のように宣言されたクラスがあります。


public class Foo<T> : Panel where T : Control, IFooNode , new()
{
    ...
}

テストのために手動で追加しましたが、最終的にはフォーム デザイナーに表示できるものが必要になります。フォーム デザイナーはこれを気に入らず、次のように述べています。

タイプ「FooTestNameSpace.Foo」が見つかりませんでした。
アセンブリが次のことを確認してください。
このタイプが参照されます。
この型が開発プロジェクトの一部である場合は、
プロジェクトが正常にビルドされたことを確認してください。

興味深いことに、同様の警告も表示されますが、変数の宣言で使用したジェネリック型が含まれています。警告は次のとおりです。

タイプ 'FooTestNameSpace.Foo<FooTestNameSpace.FooNodeType>' が見つかりませんでした。
この型を含むアセンブリが参照されていることを確認してください。
このタイプが開発プロジェクトの一部である場合、
プロジェクトが正常にビルドされたことを確認してください。

私の単純な Form1 クラスの宣言は次のとおりです。

プライベート FooTestNameSpace.Foo myFoo;

(FooNodeType は実際には、まだ使用されていない 1 つの補助プロパティを持つ Label の単なるサブクラスです。IFooNode を実装しています)。

だから私の質問...このタイプのセットアップでは、どうすればFooをフォームデザイナーに表示させることができますか、または少なくともFooが合法であることを認めさせることができますか? これを処理できる Designer 属性はありますか? Foo コントロールが空のボックスとして表示されるかどうかは、まったく気にしません。

4

2 に答える 2

7

わかりました、私は解決策があると思います:



class ConcreteFooCtl : FooCtl<FooNodeType>
{
}

class FooCtl<T> : Panel where T : Control, IFooNode , new()
{
}

問題は、フォームデザイナが汎用コントロールを処理できないことのようです。フォームデザイナはFooCtlを処理できませんが、ConcreteFooCtlに問題はありません。理想的な解決策ではありませんが、少なくとも実行可能だと思います。おそらく、VSの次のバージョンでは、フォームにジェネリックコントロールを追加するときに、ユーザーにジェネリック型を指定するように求められます...;)

于 2009-10-20T03:13:31.533 に答える
1

Fooをジェネリックにする代わりに、非ジェネリックにして、必要なことを実行するジェネリッククラスを含める方がよい場合があります。その後、フォームからクラスにすべての処理を委任できます。

于 2009-10-20T03:13:18.460 に答える