DOBON.NET DOBON.NETプログラミング掲示板過去ログ

Colorプロパティのデフォルト値の簡単な指定方法発見

環境/言語:[.NET1.1 C#]
分類:[.NET]

はじめまして!どぼんさんのサイトでいつも勉強させていただいております。
分かりやすく大変ためになるので、とても助かっております。

Colorプロパティのデフォルト値の指定方法で、簡単な方法を見つけましたので書き込みます。

http://dobon.net/vb/dotnet/control/propertygrid.html

↑では、ShouldSerialize を使っていますが、もっと簡単な方法を見つけました。

http://www.orthogonal.com.au/hobby/computers/blog/0100.htm

こちらで見つけたんですが、属性を使って
[DefaultValue(typeof(Color),"Pink")]
のように書けるそうです。
「DefaultValue( typeof(Color), "68, 86, 136" )」のような指定もできました。

FontやSizeも同様にできました。
[DefaultValue( typeof(Font), "MS Pゴシック, 9pt" )]
[DefaultValue( typeof(Size), "6, 6" )]
のように書けます。
.NET1.1 C#で確認済みです。
ご報告ありがとうございました。次の機会に修正させていただきます。
補足)
●DefaultValueはShouldSerializeより先に検索されるようです。

ところで、

●DefaultValue(type,string)は、使用したいクラスのための、
stringとの型コンバータが実装されている必要があります。
ので、自作クラス(やサードパーティ製クラス)の場合、注意が必要です。

実装すればいろんな場面で便利でしょうけど、
私は、
○いちいち自分のクラス用にコンバータを作るのが面倒な上、
○作るとしても、メンバフィールドが色々あるクラスの場合にstringとの
型コンバータを書こうとする時に一体どこまで必要なんだ?とかふと思ってしまったり、
○stringで渡す範囲決めたとして代表的な形態のためだけに型コンバータクラスわざわざ作って
区別しても他の場合結局ShouldSerialize使うし、とか思ったり、
○それに何かstring渡しの初期化はいっぱい散らばってると汚いし、
○何より、実行してみないと記述がほんとにあってるかわかんない!し、
で、
ShouldSerializeに逃げています・・・。
コード記述中にすぐ間違いが分かるのは大きいですよね。

Colorのデフォルト値に「ラベンダー」とかセットしようとすると、
何か高確率で間違いそうですよね。(私だけ?)

私の中の基準では、
単純型の場合DefaultValueで、
複雑な型(参照型だけでなく構造体も)の場合はShouldSerializeで、
とか何となく決めてますが、皆さんは、型コンバータを作っていますか?
■No9765に返信(こど。さんの記事)
> 補足)
> ●DefaultValueはShouldSerializeより先に検索されるようです。

お〜、すばらしい情報ですね!
これってどのように調べられたのですか?もしよろしければ教えてください。

属性まわりの情報って、MSDNで調べると、その属性値の取得方法ばかり書いてあって、その属性の利用方法がよく分からなくて困っています。
その属性を利用すると何がどうなるのかってのが知りたいときは、試行錯誤ばかり繰り返しています。


> ●DefaultValue(type,string)は、使用したいクラスのための、
> stringとの型コンバータが実装されている必要があります。
> ので、自作クラス(やサードパーティ製クラス)の場合、注意が必要です。

なるほど!コンバータによって設定されるんですね。TypeConverterが噛んでいるんですね。勉強になります。


> Colorのデフォルト値に「ラベンダー」とかセットしようとすると、
> 何か高確率で間違いそうですよね。(私だけ?)

属性のところでインテリセンスが効かないのは不便ですよね。

> ○それに何かstring渡しの初期化はいっぱい散らばってると汚いし、
同意!属性によるプログラムって、便利は便利ですが、各言語のプログラムとは別のものになってしまうので、ちょっといやらしいですね。
> DefaultValueはShouldSerializeより先に検索されるようです。


ちょっとマニュアル調べてみたところ・・・
すみません、何かと記憶違いしていたようです。
PropertyDescriptor.ShouldSerializeValueの「解説」辺りが、私の頭の誤動作の原因かと・・・。

で、ですが、
ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.1041/cpguide/html/cpconshouldpersistresetmethods.htm
に、
「DefaultValueAttribute を適用するか、または ResetPropertyName メソッドと
ShouldSerializePropertyName メソッドを指定します。
この 2 種類の操作を同時に実行しないでください。」
とありますから、両方書いてはいけないようです・・・。
どちらかにしてください。
(というか、プロパティの既定値を簡単に設定できる場合はDefaultValueAttribute、
できない場合は代わりにShouldSerializeとResetを実装するように、ということになるかと。)


> 属性のところでインテリセンスが効かないのは不便ですよね。
文字列リテラルの中身部分だから仕方ないかと・・・。
■No9789に返信(こど。さんの記事)
> ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.1041/cpguide/html/cpconshouldpersistresetmethods.htm
> に、
> 「DefaultValueAttribute を適用するか、または ResetPropertyName メソッドと
> ShouldSerializePropertyName メソッドを指定します。
> この 2 種類の操作を同時に実行しないでください。」

こどさん、調べていただいてありがとうございます。読んでみました。


> (というか、プロパティの既定値を簡単に設定できる場合はDefaultValueAttribute、
> できない場合は代わりにShouldSerializeとResetを実装するように、ということになるかと。)

そうですね、この方針がいいようです。

で、DefaultValueAttribute と、ResetPropertyName &ShouldSerializePropertyName の両方指定はやっちゃだめと記述があるので、やってみましたw

結論は、VisualStudio.NET2003では特にエラー等も出ず、

> > DefaultValueはShouldSerializeより先に検索されるようです。

の動作をしました。
ただ、やるなと書いてあり、必ずしも動作するとは限らないのでやるべきではないですね。
いろいろと勉強になりました、こど。さん、どうもありがとうございます!

DOBON.NET | プログラミング道 | プログラミング掲示板