C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: プロパティのデフォルト値について


(過去ログ 117 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■68794 / inTopicNo.1)  プロパティのデフォルト値について
  
□投稿者/ むぅ (1回)-(2013/11/16(Sat) 12:50:05)

分類:[C#] 

2013/11/16(Sat) 12:55:59 編集(投稿者)

お世話になります。
Buttonなどから派生したカスタムコントロールを作成し、プロパティをPropertyGridに表示しています。
プロパティにはデフォルト値を指定しているのですが、ファイル保存時にデフォルト値と異なる
ものだけを保存するようにしたいです。

クラスの例です。
class ButtonEx : Button
{
[Browsable(true)]
[DefaultValue(tool)]
public bool visibleflg{省略}

[Browsable(true)]
public Color outcolor{省略}
public bool ShouldSerializeoutcolor()
{return outforecolor != Color.FromArgb(0xff, 0x00, 0x00, 0x00);}
}

保存対象はBrowsable=trueで値の変更したものだけ取得したいので、以下のようにしています。

//保存対象のプロパティを列挙し、文字列をかえす。
private string GetProps<T>(T SrcCtl)
{
//○Publicメンバを取得する
MemberInfo[] members = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
//○Browsable=Trueのメンバーのみコピーする。
for (int i = 0; i < members.Length; i++)
{
AttributeCollection attributes = TypeDescriptor.GetProperties(SrcCtl)[members[i].Name].Attributes;
BrowsableAttribute myAttribute = (BrowsableAttribute)attributes[typeof(BrowsableAttribute)];
if (myAttribute.Browsable == true)
{
DefaultValueAttribute defAttribute = (DefaultValueAttribute)attributes[typeof(DefaultValueAttribute)];
if (defAttribute!=null && !defAttribute.IsDefaultAttribute())           //←ここの判定がまずい?
{
//ここに保存したいプロパティを連結した文字列を作成する処理をいれていきます。
Debug.Print(members[i].Name);
}


上記で実行してみると、どうやらデフォルト値設定のあるもの全てが列挙されてしまいました。

デフォルト値から変更されているものを判定するにはどのようにすればよろしいでしょうか。

以上、よろしくお願いします。

引用返信 編集キー/
■68795 / inTopicNo.2)  Re[1]: プロパティのデフォルト値について
□投稿者/ Azulean (237回)-(2013/11/16(Sat) 13:26:01)
No68794 (むぅ さん) に返信
> DefaultValueAttribute defAttribute = (DefaultValueAttribute)attributes[typeof(DefaultValueAttribute)];
> if (defAttribute!=null && !defAttribute.IsDefaultAttribute())           //←ここの判定がまずい?

DefaultValueAttribute のメソッド一覧をまず確認してみましょう。
http://msdn.microsoft.com/ja-jp/library/system.componentmodel.defaultvalueattribute_methods

すると、IsDefaultAttribute を確認すると「派生クラスでオーバーライドされたとき...」と書かれているように、既定では false しか返しません。
そして、Attribute クラスが用意しているメソッドであることがわかります。

要するに、DefaultValueAttribute と関係あるように見えて、実は違う意味の「既定値」ということになります。
(たぶん、どれかの属性が既定値というような意味合いで、プロパティに対する話ではないはず)


さて、そうなるとどうすればよいかですが、一度基本に立ち返ってクラスの説明を読んでみましょう。
例のところにずばりのヒントがありますね。
http://msdn.microsoft.com/ja-jp/library/System.ComponentModel.DefaultValueAttribute
引用返信 編集キー/
■68796 / inTopicNo.3)  Re[2]: プロパティのデフォルト値について
□投稿者/ むぅ (2回)-(2013/11/16(Sat) 13:57:38)
Azulean 様
さっそくの回答、ありがとうございます。

質問を書いたあと、Valueに気がつき実装をしているところでした。
やはり、現在の値を取得してdefAttribute.Valueと比較する、という方法になるのですね。

ひとまず、希望通りの動作ができるようになりました。

なお、DefaultValueを指定指定している場合と、ShouldSerializeを指定している場合でパターン
分けが必要でした。

どうもありがとうございました。
解決済み
引用返信 編集キー/
■68797 / inTopicNo.4)  Re[3]: プロパティのデフォルト値について
□投稿者/ IWC時計 (1回)-(2013/11/17(Sun) 00:18:38)
IWC時計 さんの Web サイト
オメガは申し訳ないくらいの値引価格になっていることがあります。


引用返信 編集キー/
■68798 / inTopicNo.5)  Re[4]: プロパティのデフォルト値について
□投稿者/ ハイネ (1回)-(2013/11/17(Sun) 00:34:10)
ハイネ さんの Web サイト
カルティエやブルガリ、ショパールを避ければいいのでしょうか?
オリスにしろハミルトンにしろ、デザインが気に入れば買う。
カルティエやブルガリが宝飾系になりますね。
http://www.handbag-jap.com/sb-bvlgari.htm
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -