2010-01-07 9 views
5

특성이있는 기본 클래스가 있으므로 파생 클래스에서 숨기려고합니다. 리플렉션을 사용하는 것 이외의 다른 방법이 있습니까?C# 파생 클래스의 특성

[Authorize(Roles = "User,Admin,Customs")] 
public abstract class ApplicationController : Controller 
{ 
} 

// hide the Authorize attribute 
public class ErrorController : ApplicationController 
{ 
} 
+0

어떤 이유인지 나는이 질문에 대해 혼란스러워합니다. –

+0

이것이 MVC에 관한 것이라면, 태그를 붙여주십시오. –

+0

기본 클래스가 해당 속성으로 꾸며져 있다는 것을 반사와 함께 볼 수 없습니까? –

답변

2

자신의 클래스로 AuthorizeAttribute를 재정의하고 상속되지 않도록 지정할 수 있습니다.

[AttributeUsage(AttributeTargets.Class, Inherited=false)] 
public class NonInheritedAuthorizeAttribute : AuthorizeAttribute 
{ 
    // Constructors, etc. 
} 

이제 ApplicationController를 소유하고있는 한 사용할 클래스를 지정할 수 있습니다.

+0

나는 이것에 대해서도 생각했지만 가능하면 Microsoft 클래스를 사용하려고 했으므로 기본 클래스에서 Authorize 특성을 제거하고 각 파생 된 컨트롤러에 추가했습니다. – PaulN

+0

'Inherited = false'의 경우 +1, MVC는 아니지만 파생 클래스/메소드가 속성 속성을 수정하지 않는지 확인하십시오. – CallMeLaNN

1

'숨기기'의 의미에 약간의 차이가 있습니다. 이 같은 승인을 취소 할 수 있어야한다 :

// hide the Authorize attribute 
[Authorize(Roles = "")] 
public class ErrorController : ApplicationController 
{ 
} 
+1

이것은 내가하고 싶은 것입니다. (권한이없는 사람이보기를 볼 수있게하십시오). 불행히도, AuthorizeAttribute는 먼저 (! user.Identity.IsAuthenticated)를 검사하여 역할의 유효성을 검사합니다. 그렇기 때문에 기본 클래스에서 ErrorController 클래스에 대한 특성을 "숨기거나"제거해야합니다. – PaulN

+2

아마도 상속 디자인을 재고해야합니다 : 새로운 기본 클래스를 만들고 그로부터 두 컨트롤러를 파생시킵니다. –

2

는 방법/소유가 된 경우 다시 선언 할 수 (new)을 구성원을 일으키는 특성이없는. 클래스 수준 특성을 가진 방법을 알지 못합니다.

public new SomeType Foo() { return base.Foo(); } 
0

당신은 다음과 같이 당신의 속성 클래스의 'AttributeUage'속성을 지정할 수 있습니다

[AttributeUsage(AttributeTargets.Class, Inherited=false)] 
public class AuthorizeAttribute : Attribute 
{ 
} 

을 그런 다음 속성을 적용한 클래스에서 파생 클래스는 상속되지 않습니다 속성.

아우, 이제 Authorize 특성이 사용자 지정 특성이 아니라는 것을 알았습니다.

+0

예, System.Web.MVC의 Microsoft 팀에서 만든 클래스입니다. – PaulN

3

기본 클래스에서 상속 된 피쳐를 제거하면 Liskov Substitution Principle에 위배됩니다. 이런 식으로 상속을 깨기는 루트 문제를 변경하기에는 너무 늦은 후에 의도하지 않은 예기치 않은 결과가있는 추악한 머리를 보통 — 후에 발생시킵니다.

그래서 길이 있더라도 대다수의 시간에 사용해서는 안된다고 대답 할 것입니다. 상속에 대한 대안 (예 : 은 상속의 이 - 인 대신 임) 또는 둘 다 구현할 수있는 별도의 인터페이스로 리팩터링하는 것과 같이 적용 할 수 있습니다. 또는 둘 다 결합 할 수도 있습니다.

+0

기본 클래스를 사용하여 사이트에 대한 기본 인증을 설정하는 것이 좋습니다. 나는 오직 Admins 만 허용하는 9 개의 컨트롤러 중 1 개만 가지고 있습니다. 기본 클래스 특성을 제거 할 수없는 것처럼 보일 때 이것은 가장 건전한 조언입니다.[Authorize (Roles = "User, Admin, Customs")]을 제거했으며 모든 컨트롤러에서 설정합니다. – PaulN

+0

속성은 클래스 멤버와 같지 않으며 반드시 상속 될 필요는 없습니다 (이 때문에 'AttributeUsage (Inherited = false)'가 있습니다). 따라서 LSP가 반드시 여기에 적용되는 것은 아닙니다. –

관련 문제