回答:
これは実際に何を達成しようとしているのかに依存します。
System.ComponentModel.TypeDescriptorのものは種類、プロパティとオブジェクトインスタンスに属性を追加するために使用することができ、そしてそれはあなたがよくて、これらのプロパティを取得するためにそれを使用する必要がないという制限があります。これらの属性を使用するコードを記述していて、それらの制限の範囲内で生活できる場合は、間違いなくお勧めします。
私の知る限りでは、PropertyGridコントロールとビジュアルスタジオのデザインサーフェイスだけが、TypeDescriptor要素を使用するBCL内の唯一のものです。実際、それは彼らが本当にする必要があることの約半分をする方法です。
TypeDescriptor
とTypeDescriptionProvider
?実装されていない
[Attr(1), Attr(2), Attr(3)]
のみAttr(3)
が見つかりました。
まあ、違いますが、Reflection.Emitを使用して参照する記事を見つけました。
ここにリンクがあります:http : //www.codeproject.com/KB/cs/dotnetattributes.aspx、考えられるアプローチについて説明しているので、記事の下部にあるコメントのいくつかを確認することもできます。
YourClass
化するかもしれませんYourRuntimeClassWithAttributes
。
YourClass
場合は、実行時にそれをサブクラス化し、目的の動的に作成された属性も持つわずかに異なる名前で同一のクラスを生成できます。ポリモーフィズムにより、型チェックコードで識別できます。あなたのベースクラス。
いいえ、ちがいます。
属性はメタデータであり、コンパイルされたアセンブリにバイナリ形式で格納されます(これは、属性で単純型のみを使用できる理由でもあります)。
私はそうは思いません。私が間違っているとしても、あなたが期待できる最善の方法は、それらをTypeのインスタンスではなく、Type全体に追加することです。
なぜする必要があるのですか?属性はリフレクションのための追加情報を提供しますが、必要なプロパティが外部でわかっている場合は必要ありません。
データベースまたはリソースファイルに比較的簡単に外部からメタデータを保存できます。
System.ComponentModel.TypeDescriptorを使って非常に頑張ったが成功しなかった。それが機能しないという意味ではありませんが、そのためのコードが欲しいです。
対応として、いくつかの属性値を変更したいと思いました。その目的のためにうまく機能する2つの関数を実行しました。
// ************************************************************************
public static void SetObjectPropertyDescription(this Type typeOfObject, string propertyName, string description)
{
PropertyDescriptor pd = TypeDescriptor.GetProperties(typeOfObject)[propertyName];
var att = pd.Attributes[typeof(DescriptionAttribute)] as DescriptionAttribute;
if (att != null)
{
var fieldDescription = att.GetType().GetField("description", BindingFlags.NonPublic | BindingFlags.Instance);
if (fieldDescription != null)
{
fieldDescription.SetValue(att, description);
}
}
}
// ************************************************************************
public static void SetPropertyAttributReadOnly(this Type typeOfObject, string propertyName, bool isReadOnly)
{
PropertyDescriptor pd = TypeDescriptor.GetProperties(typeOfObject)[propertyName];
var att = pd.Attributes[typeof(ReadOnlyAttribute)] as ReadOnlyAttribute;
if (att != null)
{
var fieldDescription = att.GetType().GetField("isReadOnly", BindingFlags.NonPublic | BindingFlags.Instance);
if (fieldDescription != null)
{
fieldDescription.SetValue(att, isReadOnly);
}
}
}
Javaでは、以前はマップを使用してこれを回避し、Key-Valueコーディングに独自のテイクを実装していました。
http://developer.apple.com/documentation/Cocoa/Conceptual/KeyValueCoding/KeyValueCoding.html
TypeDescriptor
-だけではなくPropertyGrid
。