3

キャッシュ プロキシ クラスの作成をできるだけ簡単にしようとしています。簡単な API を使っていくつかの異なる実験を行ってきましたが、それほど簡単ではありません。

現在、属性と反射を調べて、「魔法のように」解決できるかどうかを確認しています。たとえば、次のクラスがあるとします。

public static MyCache
{
  [Cache("foobar")]
  public static string Foobar { get; set; }
}

どういうわけかそれに相当するものを大量生産させます

public static MyCache
{
  [Cache("foobar")]
  public static string Foobar
  {
    get
    {
      return (string)Cacher.Get("foobar");
    }
    set
    {
      Cacher.Set("foobar", value, new CacheOptions()); //or whatever
    }
  }
}

これが有効であるように、どちらのバージョンも呼び出し元には「通常」に見えるはずですが、

MyCache.Foobar="meh";
Assert.IsEqual("meh", MyCache.Foobar);

このようなものを機能させるリフレクションで利用できるものはありますか?

4

1 に答える 1

2

このようなものを機能させるリフレクションで利用できるものはありますか?

いいえ、特にプロパティが仮想でない場合は、それを達成するために利用できるものはありません。プロパティが仮想の場合、Castle.DynamicProxyなどのフレームワークを使用してアスペクト指向プログラミングを行うことができます。Rhino Mocks や NSubstitute などの一般的なモッキング フレームワークは、ランタイム プロキシ オブジェクトを生成するためにこれを使用します。もちろん、これは仮想メンバーでのみ機能します。あなたが示した例では、織り込むことができない静的プロパティがあります。

PostSharpそれを達成するために、コンパイル後の処理ツールを使用できます。生成された IL を変更することで機能します。

于 2013-02-03T18:45:14.207 に答える