- PR -

C# Attributeのつかいどころがわからない

投稿者投稿内容
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-09-17 11:46
引用:

影羽さんの書き込み (2006-09-17 10:08) より:

後者のほうです。COM使用の際に使う時など必須の機能ではあるのですね。


C# の場合、Windows API 呼び出す時に必須ですよね。(DllImportAttribute)
もちろん、使う必要がない場合も多いですけど。

引用:

ドキュメント管理用に使っているとのことですが、具体的にどのように
使っているか、簡単でかまいませんので教えていただけませんか?


使い方はすでに書いています。
クラス ライブラリ仕様書を自動生成する時に使用しています。

引用:

具体的な自作されている属性の名前、コンストラクタのパラメータなどを教えていただければと思います。


Author とか、UpdateDateTime とかですね。

引用:

この属性をプログラムの中で条件分岐で利用したりすることはあるのでしょうか。


わけが分からなくなること必至ですから、私はないです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
影羽
常連さん
会議室デビュー日: 2006/09/16
投稿数: 20
投稿日時: 2006-09-17 11:50
>Kazuk様
なるほど。if文などで使うことはまずないのですね。

>ognac様
具体的に説明していただきありがとうございます。
propertyのsetアクセッサの中でリフレクションからformatパラメータ
を読むのですね。

なんというかリフレクションとの組み合わせで
class CheckReg
{
//いろいろなクラスのext属性を持つフィールドの
//正規表現チェックを行って結果を返す
public Result Check(object obj)
}

というような構造化ができそうな気がします。

ただ確かに多用すると逆にスパゲッティになりそうな気もしますね。。

>Edosson様
どうしても気になってしまいます笑
Edosson様はどのようにしてお使いですか?よろしければお教えください。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-09-17 12:38
引用:

じゃんぬねっとさんの書き込み (2006-09-17 11:46) より:

C# の場合、Windows API 呼び出す時に必須ですよね。(DllImportAttribute)
もちろん、使う必要がない場合も多いですけど。


あっ、なんで COM の時って書いたんだろう、
COM でも使うけれど WindowsAPI のほうが解りやすかったですよね
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2006-09-17 14:46
まあすでに出ているような使い方をするわけだ。
使いどころがわからんのは使うべき場面に出くわしていないか、本当に無知で使えなかったのかどちらかだろう。
おそらく使うべき場面に出くわしていないだけなので使いたいからって無理に使う必要もない。
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2006-09-19 16:24
私は列挙型の項目に文字列などを割り当てる時に使うことがあります。
まず属性型を作ります。
コード:
public class CodeAndNameAttribute : Attribute
{
	public readonly string Code;
	public readonly string Name;

	public CodeAndNameAttribute(string code, string name)
	{
		Code = code;
		Name = name;
	}
}


列挙型の項目に作った属性を適用します。
コード:
public enum Youbi
{
	[CodeAndName("01", "日曜日")] San,
	[CodeAndName("02", "月曜日")] Mon,
	[CodeAndName("03", "火曜日")] Tue,
	・・・・(略)
}


列挙型の項目は、CIL上はクラスのフィールドとして表現されているようなので、以下のようなメソッドを定義して、
コード:
public T GetEnumAttribute<T>(Enum field) where T : Attribute 
{
	FieldInfo fInfo;

	fInfo = GetFieldInfo(field);

	return (T)Attribute.GetCustomAttribute(fInfo, typeof(T));
}

public FieldInfo GetFieldInfo(Enum field){
	Type enumType;
	string name;
			
	enumType = field.GetType();
	name = Enum.GetName(enumType, field);
	return enumType.GetField(name);
}


以下のようにすると属性のインスタンスが取れます。
コード:
CodeAndNameAttribute attr;
attr = GetEnumAttribute<CodeAndNameAttribute>(Youbi.Mon);


後はattr.Nameを見れば"月曜日"という文字列が取れます。
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2006-09-19 17:25
System.ComponentModel 名前空間のものは良く使いますね。
あとは Serializable とか Obsolete とか。

【追記】
試しにコントロールとか作ってみると、使いどころが判るんじゃないでしょうか。


[ メッセージ編集済み 編集者: きくちゃん 編集日時 2006-09-19 17:36 ]
影羽
常連さん
会議室デビュー日: 2006/09/16
投稿数: 20
投稿日時: 2006-09-19 17:38
>>一郎様

なるほど。。
未熟者ですので正しいかどうかわかりませんが、enumの機能が無理なく拡張
されているかと思います。

Youbi をクラスで定義することもできるかと思いますが、その場合に比べて
どのようなメリットがありますか?

よろしければお教えください


一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2006-09-20 19:50
引用:

影羽さんの書き込み (2006-09-19 17:38) より:
Youbi をクラスで定義することもできるかと思いますが、その場合に比べて
どのようなメリットがありますか?


そうですね。例えば
コード:

public struct Youbi
{
public static readonly Youbi Null = new Youbi();
public static readonly Youbi Sun = new Youbi(1);
public static readonly Youbi Mon = new Youbi(2);
public static readonly Youbi Tue = new Youbi(3);
・・・(略)

private int val;

private Youbi(int code)
{
val = code;
}

public override string ToString()
{
switch (val)
{
case 0: return "なし";
case 1: return "日曜日";
case 2: return "月曜日";
case 3: return "火曜日";
・・・(略)
default: return null;
}
}
}


構造体にしてみましたが、こんな感じになるんでしょうか?(動作確認はしてません)

・・・いや、いいんじゃないでしょうか。
これでもいいですね。(こういう型は作ったことないけど)

列挙型は、数値に名前を振っただけみたいな感じなので、複雑な機能を持たない単純な値の場合はすっきりしていいですよね。
あと、VisualStudioのIntelliSenseに余計なメンバー(Equalsとか)の一覧が出なかったり、扱う場合にクラスより高速に動作する(?)などあると思います。
逆にクラスにすると、メソッドを持てるので何らかの機能を付けることができると思います。(例えば休日かどうかの判定をするメソッドとか)
複雑な機能がある場合はこっちですね。

------------
前の書き込みの日曜日が"San"になってた・・・・
はずかしい。

------------
SunとかMonとかはreadonlyじゃないとまずいですね。修正しました。

[ メッセージ編集済み 編集者: 一郎 編集日時 2006-09-21 09:54 ]

スキルアップ/キャリアアップ(JOB@IT)