私は一晩中これを理解しようとしてきましたが、.Net Framework に関する私の知識はそれほど深くなく、問題は正確に Google にうまく当てはまらないと思いますが、正しい方向にうなずくことができれば、私は何らかの方法で実装できると確信しています。
カスタム属性で装飾されたプロパティを次のように宣言できるようにしたいと思います。
public MyClass {
[ReplaceWithExpressionFrom(typeof(SomeOtherClass))]
public virtual bool MyProperty { get; }
}
public SomeOtherClass : IExpressionHolder<MyClass, bool> {
...
}
public interface IExpressionHolder<TArg, TResult> {
Expression<Func<TArg, TResult>> Expression { get; }
}
そして、どういうわけか-これは私が理解するのに苦労している部分です-そのゲッターの自動生成された実装を、次のようなカスタムコードに置き換えます。
Type expressionHolderType = LookupAttributeCtorArgTypeInDeclarationOfPropertyWereReplacing();
return ReplaceWithExpressionFromAttribute.GetCompiledExpressionFrom(expressionHolderType)(this);
どのようにすればよいかわからない主なことは、get の自動実装を置き換えることです。
最初に頭に浮かんだのはPostSharp でしたが、それは私が気にかけているよりも複雑な依存関係です。私は、ビルドに添付された後処理を使用せずにコーディングする方法をはるかに好みます (とにかく、PostSharp がそのフックをシンクする方法の要点だと思います)。
この他の部分は、ReplaceWithExpressionFrom 属性の特定のインスタンス化に渡された型パラメーターを取得する方法です (ここで、本体を置き換えたいプロパティを装飾します。つまり、typeof を取得するにはどうすればよいですか)。 (SomeOtherClass) get body 置換をコーディングしている場所)。IExpressionHolder の具体的なインスタンスからコンパイル済みの式をキャッシュする予定です。プロパティが取得されるたびにキャッシュするのは避けたいからです。
私はこれが可能でなければならないと考えています。少なくとも、属性で装飾されたメソッドのアセンブリを検索し、何らかの方法でクラスをプロキシするか、単に IL または .. 何かを置き換えることができるはずだと思いますか? そして、統合をできるだけスムーズにしたいので、どこかで登録または初期化メソッドを明示的に呼び出すことなくこれを行うことができれば、それは非常に素晴らしいことです.
ありがとう!