0

実行時にDerived.MyPropertyのgetが実際にBase.GetProperty( "MyProperty")を呼び出し、Derived.MyPropertyのセットがBase.SetProperty( "MyProperty"、valueを呼び出すようにカスタム属性(MyAttribute)を作成することは可能ですか? )。

class Derived : Base
{
  [MyAttribute]
  string MyProperty { get; set;}
}

class Base
{
  XmlDoc _xmldoc;
  void SetProperty(string key, string value)
  {
    set key, value into _xmldoc;
  }
  string GetProperty(string key);
  {
    get key value from _xmldoc;
  }
}

以下のコメントから導き出された解決策は次のとおりです。すべてのコメント投稿者に感謝します。

public class WatchAttribute : HandlerAttribute
{
  public override ICallHandler CreateHandler(IUnityContainer container)
  {
    return new WatchHandler();
  }
}

public class WatchHandler : ICallHandler
{
  public int Order { get; set; }
  public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
  {
    Console.WriteLine(string.Format("Method '{0}' on object '{1}' was invoked.", 
    return getNext()(input, getNext);
  }
}

public class SomeAction : MarshalByRefObject
{
  [Watch]
  public string MyProperty1 { get; set; }

  public string MyProperty { get; set; }
}

class Program
{
  static void Main(string[] args)
  {
    SomeAction c = new SomeAction();
    IUnityContainer container = new UnityContainer()
      .AddNewExtension<Interception>();
    container.Configure<Interception>()
      .SetInterceptorFor<SomeAction>(new TransparentProxyInterceptor())
      .AddPolicy("WatchAttribute Policy")
      .AddMatchingRule(new PropertyMatchingRule("*", PropertyMatchingOption.GetOrSet));
    container.RegisterInstance<SomeAction>(c);
    c = container.Resolve<SomeAction>();

    c.MyProperty1 = "Hello";
    c.MyProperty = "Hello";
  }
}
4

1 に答える 1

1

ユニティインターセプトを使用すると、必要なメソッドをラップするプロキシを作成し、ここでメソッドをフィルタリングするルールを指定できるため、より適切になります。説明: http ://www.lm-tech.it/Blog/post/2011/10 /18/How-to-use-the-Unity-Interception-Extension.aspx これにより、属性を設定せずにプロセスを作成でき、開発者は、たとえばルール名(xmldocで機能するすべてのプロパティ)に従うだけで済みます。プレフィックスはXml_..です。

于 2012-08-18T02:06:54.653 に答える