c#一次继承2个类

时间:2015-09-10 21:00:55

标签: c# asp.net-mvc inheritance custom-attributes

我在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类。

1 个答案:

答案 0 :(得分:2)

它并不是完全无缝的,但是对于这种情况,您希望提供常见辅助方法的一个选项是使用扩展方法。这并不是为扩展方法设计的,因此不必将调用包装在某些共享类中的便利性被其他开发人员查看代码并对这些方法的来源混淆所困扰。 / p>

public interface IUserHelperMethods
{
    // Empty marker interface
}

public static class UserHelperExtensions
{
    public static ClaimsPrincipal GetCurrentUser(this IUserHelperMethods)
    {
        return HttpContext.Current.User as ClaimsPrincipal;
    }
}

public class ApiControllerBase : ApiController, IUserHelperMethods
{
    public void Foo()
    {
        this.GetCurrentUser();
    }
}

public class AuthorizeAttributeTotalAccess : AuthorizeAttributeBase, IUserHelperMethods
{
    public void Foo()
    {
        this.GetCurrentUser();
    }
}

另请注意,我必须将您的属性更改为Get ...()方法,因为C#不支持扩展属性。