0

たとえば、プロパティと属性を持つクラスがあります。

[MyDisplay(Name = "Class name", Description = "Class description.")]
public class MyClass
{
    [MyDisplay(Name = "Property name", Description = "Property description.")]
    public int MyProperty { get; set; }
}

次のような属性値を取得したい

// Get type attribute...
string className = MyClass.Attributes.MyDisplay.Name;

// Get member attribute...
string propertyDescription =
    MyClass.Properties.MyProperty.Attributes.MyDisplay.Description;

どうやって入手するの?MyClassの追加フィールドに属性データを自動的に入力するコードが必要です。インスタンス値のように、バインディングなどの属性値にアクセスするのは非常に便利なようです。

主な複雑さは、MyClass.AttributesコレクションとMyClass.Propertiesコレクションを、プロパティおよび属性名と同じ名前のオブジェクトで埋めることです。したがって、このコレクションは静的である必要があると思います。また、MyClass.Propertiesコレクション内の各オブジェクトには、MyClass.AttributesコレクションのようなAttributesコレクション(たとえば、MyProperty.Attributes)も必要です。

4

1 に答える 1

0

何を達成しようとしているのかはわかりませんが、以下のコードにより、実行時にアセンブリから属性データを抽出する方法がわかります。属性データは型のインスタンスごとではなく、型宣言ごとであることに注意してください。

    foreach (var type in System.Reflection.Assembly.GetExecutingAssembly().GetTypes())
    {
        // class attributes
        foreach (var typeAttr in type.GetCustomAttributes(typeof(DisplayAttribute), false))
        {
            Console.WriteLine(((DisplayAttribute)typeAttr).Name);
            Console.WriteLine(((DisplayAttribute)typeAttr).Description);
        }

        // members attributes
        foreach (var props in type.GetProperties())
        {
            foreach (var propsAttr in props.GetCustomAttributes(typeof(DisplayAttribute), false))
            {
                Console.WriteLine(((DisplayAttribute)propsAttr).Name);
                Console.WriteLine(((DisplayAttribute)propsAttr).Description);
            }
        }
    }
于 2013-02-10T12:26:34.717 に答える