C# 获取PostSharp中OnMethodBoundaryAspect中OnEntry中控制器的基类成员

C# 获取PostSharp中OnMethodBoundaryAspect中OnEntry中控制器的基类成员,c#,postsharp,C#,Postsharp,我希望在日志方面类中访问基类成员。我有一个基本控制器&该控制器由testcontroller继承&在testcontroller中,我实现了AOP方面 在BaseContoller中,我有一个成员\u userSession。我在调用BaseContoller的构造函数时初始化了_userSession。在调用TestController之后,将调用第一个AOP方面。我想要访问AOP的ONETRY方法上的userSession LogAspect类 [Serializable] [Mul

我希望在日志方面类中访问基类成员。我有一个基本控制器&该控制器由testcontroller继承&在testcontroller中,我实现了AOP方面

在BaseContoller中,我有一个成员\u userSession。我在调用BaseContoller的构造函数时初始化了_userSession。在调用TestController之后,将调用第一个AOP方面。我想要访问AOP的ONETRY方法上的userSession

LogAspect类

[Serializable]
    [MulticastAttributeUsage(MulticastTargets.Method)]
    public class LogAspect:PostSharp.Aspects.OnMethodBoundaryAspect
    {
        public object UserData;

        public override void OnEntry(PostSharp.Aspects.MethodExecutionArgs args)
        {
            LogManager.Info(string.Format("Starting - {0}-{0}",args.Instance, new StackTrace().GetFrame(1).GetMethod().Name));

// want access PCX.Portal.Controllers.BaseController._userSession member here its showing in quick watch like this
//((PCX.Portal.Controllers.BaseController)(args.Instance))._userSession

           LogManager.Info(string.Format("User data - {0}", FrameworkHelper.Helper.JSONHelper.GetJSON(UserData)));


            if(args.Arguments.Count>0)
            {
                foreach (var item in  args.Arguments)
                {
                    LogManager.Info(string.Format("arguments - {0}", FrameworkHelper.Helper.JSONHelper.GetJSON(item)));
                }
            }

            base.OnEntry(args);
        }
基本控制器

public class BaseController : Controller
    {
        public UserSession _userSession { set; get; }
        AuthenticationManager _authenticationManager = new AuthenticationManager();

        public BaseController()
        {
//initializing _userSession here  
                 _userSession.userid=4 ;
_userSession.customerId=5 ;
        }
}
测试控制器

[LogAspect]
    public class TestController : BaseController
    {
        public ActionResult Index()
        {
            return View();            
        }
}
如各国所述:

MethodExecutionArgs
类包含属性
实例

Gets or sets the object instance on which the method is being executed.
只要你的方法不是静态的,你就会得到这个方法中的
this
对象。现在您只需将其强制转换为
BaseController
,因为您的属性是公共的,您将能够访问它

if(args.Instance != null){
    var baseController = (BaseController)args.Instance;
    baseController._userSession
}

虽然这是您要求的,但我觉得有必要指出,这种方法将方面的可用性限制为仅继承自
BaseController
的类的实例方法。如果您能够在该无参数构造函数中的某个地方创建/检索会话数据,那么您也可以在aspect中创建/检索会话数据。

Type baseType=args.Instance.GetType().baseType;它返回基类型,但在此代码之后获取成员时遇到问题。我试过了,但没有工作,我也试过用反思,但面对问题。你能再解释一下吗。感谢您在调试args的
实例
属性和
方法
属性时使用了哪些类型的值。Type baseType=args.Instance.GetType().baseType;返回“baseType={Name=“BaseController”FullName=“PCX.Portal.Controllers.BaseController”}。现在我需要做什么?在我的回答中,复制if语句并使用
\u userSession
,因为您认为合适。实际上,LogAspect不是这个项目的一部分,它是一个在MVC项目和存储库项目中使用的库。与FrameworkHelper(包含CacheAspect和LogAspect)、PCX.Core.Repositories(包含DAL)、PCX.Portal(MVC项目)类似。因此,BaseController无法在FrameworkHelper实用程序中访问。