如果我有课:
class MyClass
{
IMyInterface _mi;
[MyAspectAttribute("_mi")]
bool _myValue;
// ...
}
有没有办法创建一个方面属性MyAspectAttribute,它拦截获取和设置(bool myValue)的值,并且还导入属性[MyAspectAttribute(“_ mi”)]中指定的字段,在这种情况下_mi是动态的我可以在方面使用它吗? (我想在获取或设置方面的字段之前调用接口。)
我知道如何编写方面我只是不知道如何动态导入指定的字段(在本例中为_mi)。所有这些示例都要求您知道要导入的确切字段名称(但我希望将名称传递给我的方面)。
感谢。
答案 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()
{
}
}