动态地从类中导入postharp aspect字段

时间:2017-08-31 17:13:07

标签: c# postsharp

如果我有课:

class MyClass
{
  IMyInterface _mi;

  [MyAspectAttribute("_mi")]
  bool _myValue;

  // ...
}

有没有办法创建一个方面属性MyAspectAttribute,它拦截获取和设置(bool myValue)的值,并且还导入属性[MyAspectAttribute(“_ mi”)]中指定的字段,在这种情况下_mi是动态的我可以在方面使用它吗? (我想在获取或设置方面的字段之前调用接口。)

我知道如何编写方面我只是不知道如何动态导入指定的字段(在本例中为_mi)。所有这些示例都要求您知道要导入的确切字段名称(但我希望将名称传递给我的方面)。

感谢。

1 个答案:

答案 0 :(得分:0)

您可以通过实施IAdviceProvider.ProvideAdvices方法动态导入字段,并为要导入的字段返回ImportLocationAdviceInstance。下面的示例方面演示了这种技术。

[PSerializable]
public class MyAspectAttribute : LocationLevelAspect, IAdviceProvider, IInstanceScopedAspect
{
    private string _importedFieldName;

    public MyAspectAttribute(string importedFieldName)
    {
        _importedFieldName = importedFieldName;
    }

    public ILocationBinding ImportedField;

    public IEnumerable<AdviceInstance> ProvideAdvices(object targetElement)
    {
        var target = (LocationInfo) targetElement;
        var importedField = target.DeclaringType
            .GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
            .First(f => f.Name == this._importedFieldName);

        yield return new ImportLocationAdviceInstance(
            typeof(MyAspectAttribute).GetField("ImportedField"),
            new LocationInfo(importedField));
    }

    [OnLocationGetValueAdvice, SelfPointcut]
    public void OnGetValue(LocationInterceptionArgs args)
    {
        IMyInterface mi = (IMyInterface)this.ImportedField.GetValue(args.Instance);
        mi.SomeMethod();

        args.ProceedGetValue();
    }

    [OnLocationSetValueAdvice(Master = "OnGetValue"), SelfPointcut]
    public void OnSetValue(LocationInterceptionArgs args)
    {
        IMyInterface mi = (IMyInterface) this.ImportedField.GetValue(args.Instance);
        mi.SomeMethod();

        args.ProceedSetValue();
    }

    public object CreateInstance(AdviceArgs adviceArgs)
    {
        return this.MemberwiseClone();
    }

    public void RuntimeInitializeInstance()
    {
    }
}