4

私は一晩中これを理解しようとしてきましたが、.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 または .. 何かを置き換えることができるはずだと思いますか? そして、統合をできるだけスムーズにしたいので、どこかで登録または初期化メソッドを明示的に呼び出すことなくこれを行うことができれば、それは非常に素晴らしいことです.

ありがとう!

4

2 に答える 2

2

多分私はこれに反対票を投じるでしょうが、なぜこれにプロパティが必要なのですか?

あなたが望んでいるように見えるのは、仮想通話です。単純に MyClass をサブクラス化して仮想呼び出しを実装しないのはなぜですか?

または、適切な関数呼び出しにデリゲートの辞書を使用することもできます。

于 2010-06-17T06:35:36.353 に答える
1

実行時にメソッドの実装を置き換えることはできないようです。

PostSharp が IL の書き換えとウィービングを行うように、コンパイル時に置き換えることができます。

また、生成されたプロキシは仮想メンバーをオーバーライドできますが、これには、本物の代わりにプロキシを配布できる集中ポイントを通じてオブジェクトを作成する必要があります (NHibernate 風)。

于 2010-12-22T19:40:19.963 に答える