0

我正在使用 PostSharp 将 CompoundAspect 应用于 ActiveRecord 类(来自 CastleProject)。代码如下所示:

public override void ProvideAspects(object targetElement, LaosReflectionAspectCollection collection)
{
    Type targetType = (Type)targetElement;
    RevertibleSubAspect revertible = new RevertibleSubAspect();
    revertible.Cascade = this.Cascade;
    collection.AddAspect(targetType, revertible);

    //This isn't working
    MethodInfo saveMethod = targetType.GetMethod("Save");
    collection.AddAspect(saveMethod, new CommitOnSaveSubAspect());

    foreach (PropertyInfo property in targetType.GetProperties())
    {
        if((this.Only != null && this.Only.IndexOf(property.Name) == -1) ||
           (this.Except != null && this.Except.IndexOf(property.Name) > -1))
        {
            continue;
        }

        if (property.DeclaringType == targetType && property.CanWrite)
        {
            MethodInfo method = property.GetSetMethod();
            if (method != null && !method.IsStatic)
            {
                collection.AddAspect(method, new TrackInitialPropertyValuesSubAspect());
            }
        }
    }
}

一切正常,除了 CommitOnSaveSubAspect 是 OnMethodBoundaryAspect。调用 Save 方法时永远不会调用 OnSuccess 方法。我已经尝试将代码移动到 OnEntry 和 OnExit 但这里的情况相同。

CommitOnSaveSubAspect 类如下所示:

[Serializable]
class CommitOnSaveSubAspect : OnMethodBoundaryAspect
{
    public override void OnSuccess(MethodExecutionEventArgs eventArgs)
    {
        ((IRevertible)eventArgs.Instance).Commit();
    }
}

我是否以错误的方式应用方面?

4

2 回答 2

2

调试方面的一个好方法是使用反射器查看生成的程序集。方法是否如您期望的那样增强?

您还可以通过将断点放入其中并使用以下命令行运行 msbuild 来调试 ProvideAspects 方法:

msbuild /p:PostSharpAttachDebugger=true
于 2009-09-13T20:13:40.570 回答
0

安装 PostSharp 时是否已全局定义?否则,您必须编辑项目文件才能将 PostSharp 正确注入到您的程序集中。

请参阅http://doc.postsharp.org/1.0/Default.aspx##PostSharp.HxS/UserGuide/Platform/EnablingPostSharp.html

于 2009-09-13T16:36:13.817 回答