1

私は、率直で簡単にできると思うことをしようとしていますが、私の人生では、それを機能させることができません. PostSharp を使用して、クラス (またはインターフェイス) 定義に適用するアスペクトを作成したいと考えています。そのアスペクトは、コンパイル時に、適用された型を反映し、その反映情報を変数に格納して、すぐに抽出できるようにします。実行時間。

CompileTimeInitialize 関数を使用してリフレクション情報を生成し、それを変数に保存する必要があることはわかっています。これはすべてシリアル化されます。ただし、実行時に情報を保存することはできません。RuntimeInitialize は変数とその中のデータを見ることができますが、GetCustomAttributes を使用してコード内の別の場所にある型から属性を取得すると、属性は空になります。

ここに私がこれまでに持っているコードのいくつかがあります:

[Serializable]
[MulticastAttributeUsage(MulticastTargets.Class, AllowMultiple = false, PersistMetaData = true)]
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)]
public class MetadataAttribute : TypeLevelAspect {

    public MetadataAttribute() { }

    private int test;

    public override bool CompileTimeValidate(Type type) {
        this.test = 11;
        return true;
    }

    public override void CompileTimeInitialize(Type type, AspectInfo aspectInfo) {
        this.test = 9;
    }

    public override void RuntimeInitialize(Type type) {
        // When I break here, I can see during debugging, that test is 11 (I would have expected 9 to be honest, but I suspect that CompileTimeInitialize is not executed for a TypeLevelAspect - unless I am mistaken?)            
    }

}

番号を抽出するために使用しようとしているコンソール アプリケーションは次のとおりです。

class Program {
    static void Main(string[] args) {
        var ma = typeof(Test).GetCustomAttribute<MetadataAttribute>();
        var test = new Test();
        var ma2 = test.GetType().GetCustomAttribute<MetadataAttribute>();
        // When I break here, both ma and ma2 have test set to 0.
    }
}

[Metadata]
public class Test { }

助けてくれてありがとう、それは非常に高く評価されており、私の髪を私の手よりも頭の上で長持ちさせるのに大いに役立ちます:)

4

1 に答える 1

1

を使用している場合Type.GetCustomAttributes、メタデータに格納されている定義からカスタム属性の新しいインスタンスを構築するよう CLR に要求しています。つまり、コンストラクターを呼び出してフィールドとプロパティを設定します。したがって、PostSharp が作成して初期化したインスタンスではなく、完全に新しいインスタンスを取得しています。

PostSharp インスタンスにアクセスする場合は、RuntimeInitializeこのインスタンスをアスペクト インスタンスの何らかの共有リポジトリに格納してから、コードからアクセスする必要があります。PostSharp はRuntimeInitialize遅延実行されるため、インスタンスが初期化されるまでインスタンスにアクセスできないことに注意してください。

于 2013-01-30T07:18:37.517 に答える