【发布时间】:2015-12-07 07:25:24
【问题描述】:
我在 C# 4.0 中遇到了一种情况,它可以从对象的多重继承中受益。
例子:
AuthorizeAttribute 和 ApiController 是 MS 标准基类。我想用我写的一个类的代码来扩展每一个,这样我就可以做到以下几点:
[AuthorizeAttributeTotalAccess]
public class TemplateController : ApiControllerBase
{
// ...
}
public class AuthorizeAttributeTotalAccess : AuthorizeAttributeBase
{
// ...
}
public class AuthorizeAttributeTotalAccess : AuthorizeAttributeBase
{
protected virtual ClaimsPrincipal CurrentUser
{
get { return HttpContext.Current.User as ClaimsPrincipal; }
}
protected virtual IEnumerable<dynamic> CurrentUserClaims
{
get
{
return from c in CurrentUser.Identities.First().Claims
select new
{
c.Type,
c.Value
};
}
}
// ...
}
public class ApiControllerBase : ApiController
{
protected virtual ClaimsPrincipal CurrentUser
{
get { return HttpContext.Current.User as ClaimsPrincipal; }
}
protected virtual IEnumerable<dynamic> CurrentUserClaims
{
get
{
return from c in CurrentUser.Identities.First().Claims
select new
{
c.Type,
c.Value
};
}
}
// ...
}
知道如何实现这一目标吗?如您所见,两个基类包含完全相同的代码,但每个基类必须继承不同的标准 MS 类。
【问题讨论】:
-
只有几行代码,但您可以将它们移动到两个类都调用的单独的静态辅助方法中。
-
.NET 不支持多重继承。时期。您可以封装两个类中的一个或两个并传递方法,但不能对两者都使用纯继承。
-
我的情况与您提供的代码类似(可能不完整)。我在我的 BaseController 中设置了一个自定义
Principal。然后,从AuthorizeAttributeTotalAccess,您可以覆盖控制器中的主体。这样一来,您就可以停止梦想多重继承,因为这是不可能的。
标签: c# asp.net-mvc inheritance custom-attributes