まぐらぼ

日々の雑記を書いています。

Attribute 属性と単体テスト

少し古いサンプルが見つかりました。
JSON.NETやってるときAttribute(属性)を調べました。

[PostTransformer("test", Precedence = 5)]
class SubClassA : BaseClass
{
public SubClassA()
{
//;
}
}

上記クラスの"test"やPrecedence=5を取り出す方法です。属性情報の取得はWPFとMETROで方法が異なります。

(a) WPF
http://ufcpp.net/study/csharp/sp_attribute.html#use の最後の方にあります。Attribute.GetCustomAttributes()を使用しているのでストアアプリでは使用できません。
(参考)リフレクション/RTTI

(b) METRO
ストアアプリではリフレクションでTypeInfoを引っ張り出してきてLINQで列挙型(a1)を取得してAttributeを取り出せます。LINQを使わないとコードが汚くなります。

public static void loadTransformers01()
{
    TypeInfo baseType = typeof(SubClassA).GetTypeInfo();

    IEnumerable a1 = baseType.Assembly.DefinedTypes.Where(
             i => baseType.IsAssignableFrom(i))
             .SelectMany(t => t.GetCustomAttributes<PostTransformerAttribute>(false));

    Debug.WriteLine("--------------------------");
    foreach (var cur in a1)
    {
        if (cur.GetType() == typeof(PostTransformerAttribute)) { // check
            PostTransformerAttribute at = (PostTransformerAttribute)cur;
            Debug.WriteLine(" {0}, {1}", at.Title, at.Precedence);
        }
    }
}

動作サンプルは次のエントリで。
サンプル行方不明になった。
(参考)Windows ストア アプリで文字列のクラス名から動的にインスタンスを生成させ実行する