私は、率直で簡単にできると思うことをしようとしていますが、私の人生では、それを機能させることができません. 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 { }
助けてくれてありがとう、それは非常に高く評価されており、私の髪を私の手よりも頭の上で長持ちさせるのに大いに役立ちます:)