none
ジェネリックパラメータを持つFormを継承したFormをデザイナで表示できない。 RRS feed

  • 質問

  • 環境:Visual Studio 2005 SP1
    言語:C#

    表題の通りなのですが、下記コード場合、IngeritFormをデザイナで表示しようとした場合に、エラーが発生します。

    1 //ジェネリックパラメータを持つForm  
    2 public class GenericForm<T> : Form {}  
    3  
    4 //ジェネリックパラメータを持つFormを継承したForm  
    5 public class InheritForm : GenericForm<string> {}  
    6  

     この症状に対し、VB.NETでは解決方法を見つけている方がいらっしゃるのですが、
    http://www.code-x.co.jp/blog/?p=11
    同等の処理をC#のFormに対して行っても、問題解決には至りませんでした。

    普段C#で開発を行っているので、VB.NETとC#でデザイナの動作が異なっていることを知らず、そのこと自体驚きなのですが、
    C#でこの現象を回避する方法をご存じの方はいらっしゃいますでしょうか?

    よろしくお願いします。

    2009年2月6日 8:33

回答

すべての返信

  • VBとの挙動の差の原因までは分かりません。
    (ちょっといじくっている限りでは分からないので、詳しい人のフォローに期待)

    回避策としては、1つ非ジェネリックな型を間に挟むという方法がUSのフォーラムで紹介されています。
    http://social.msdn.microsoft.com/Forums/en-US/csharplanguage/thread/9886516c-07e8-4386-8d1b-afe065e4c6d9/
    参考になった返信には「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に指定できます)。
    • 回答としてマーク yone64 2009年2月9日 1:17
    2009年2月6日 12:01
    モデレータ
  • 同じく回答ではありませんが…。
    デザイン時サポートの拡張というのがあって、全てのデザイナはここで説明されている機能を使って実装されています。
    それはWinFormだけでなくTimerのようなGUIを持たないコンポーネントやASP.NETのようにデザイナと実行時とで別のものを出力するものまで。
    またこれは.NET Frameworkのクラスライブラリであり、C#・VB・C++/CLIで共通です。

    試しにこれらのinterfaceや属性をひたすら適用してみましたが、問題は解決しませんでした。
    C#だとInheritFormクラスのソースコードを解析する部分で落ちていて、VBだとそこは通過できています。
    そしてInheritFormクラスが解析できていないために、あらゆる属性はまだ読み込まれる前という…。
    例示されているVBでの対策はもっと後の部分での問題への対策でした。

    とてもひねくれた回避策として、デザイン用のプロジェクト構成を用意するのはどうでしょう? そこにコンパイル時定数を設定して
    public partial class InheritForm: 
    #if DESIGN 
      Form 
    #else 
      GenericForm<string
    #endif 
     
    とか。
    2009年2月7日 16:16
  • 佐祐理 さん の発言:

    とてもひねくれた回避策として、デザイン用のプロジェクト構成を用意するのはどうでしょう? そこにコンパイル時定数を設定して

    public partial class InheritForm: 
    #if DESIGN 
      Form 
    #else 
      GenericForm<string
    #endif 
     
    とか。

    基底クラスの要素に依存するコードの記述や、コントロールの貼り付けとか困りませんか?
    (TabIndexがめちゃくちゃになったりしないかが不安)


    参考になった返信には「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に指定できます)。
    2009年2月7日 17:09
    モデレータ
  • Azulean の発言:

    基底クラスの要素に依存するコードの記述や、コントロールの貼り付けとか困りませんか?
    (TabIndexがめちゃくちゃになったりしないかが不安)

    非Genericなデザイン用のクラスを作るというのであれば、問題を回避するためのダミークラスを1層追加すること(例:public class StringForm : GenericForm<string> { })が手間なく、基底クラスの要素も使えるという意味では良いかと思ったのですが…。


    なので、「回答ではありませんが」と断っています。
    あと、この提案をした意図ですが、デザイナのために実行時に影響を与えたくないというのがあります。
    .NET Frameworkではデザイナを別アセンブリに分離するために、属性+完全修飾名を使っているわけです。
    VBの例のシリアライザが増えたり、非ジェネリックなダミークラスが増えるのはどうかな、と思いました。

    そういう意味では、デザイン時の親クラスをFormでなくStringFormにすればよさそうですね。
    2009年2月7日 17:51
  • 返信ありがとうございます。

    間に非ジェネリックFormを挟むことで、デザイナによる表示が可能であることを確認しましたので、
    その方向で回避したいと思います。

    2009年2月9日 1:17