2010-01-07 18 views
5

Bir özniteliğe sahip temel bir sınıfım var ve bunu türetilmiş bir sınıfta saklamak istiyorum. Bunu yansımayı kullanmaktan başka bir yolu var mı?C# hide Türetilmiş Sınıftaki Öznitelik

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

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

Bazı nedenlerden dolayı bu Q hakkında kafam karıştı –

+0

MVC ile ilgili ise, lütfen bunu etiketleyin. –

+0

Temel sınıfın bu öznitelikle süslendiğini düşünerek göremiyorum gibi mi? –

cevap

2

AuthorizeAttribute'ı kendi sınıfınız ile geçersiz kılabilir ve devralınmaması için belirtebilirsiniz.

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

Şimdi ApplicationController'a sahip olduğunuz sürece hangi sınıfı kullanacağınızı belirleyebilirsiniz.

+0

Bunu yapmayı da düşündüm, ancak Microsoft sınıflarını mümkünse kullanmaya çalışıyorum, bu yüzden Base sınıfımdan Authorize özniteliğini kaldırmayı ve her türetilmiş denetleyiciye eklemeyi seçtim. Inherited = false için – PaulN

+0

+1, MVC hakkında değil, öznitelik özelliklerini değiştirmeyi denemediğiniz türetilmiş sınıf/yöntem olduğundan emin olun. – CallMeLaNN

1

'Gizle' ile ne kastettiğinize bağlı. Böyle yetkiyi iptal gerekir:

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

Tam olarak benim yapmak istediğim şey budur (Yetkili olmayan bir kişinin Görüntüyü görmesine izin verin). Ne yazık ki, AuthorizeAttribute ilk önce (! User.Identity.IsAuthenticated) olup olmadığını denetler ve sonra Rolleri doğrular. Bu nedenle, yalnızca ErrorController sınıfı için "Gizle" veya temel sınıftaki Özniteliği kaldırmak istiyorum. – PaulN

+2

Belki de miras tasarımını yeniden gözden geçirmelisiniz: Yeni bir temel sınıf icat edin ve her iki kontrol cihazını da bundan türetin. –

2

bir yöntemi/prop olsaydı, yeniden declare olabilir (new) üyesi kusurlu özniteliği olmadan. Sınıf düzeyi özelliklerle bir yol bilmiyorum.

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

Bunu, sizin Özellik sınıfına 'AttributeUage' özelliği belirtebilirsiniz:

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

Sonra niteliğini uyguladığınız sınıfından türetmek sınıfları, miras olmaz bağlıyor.

Şimdi, şimdi, Authorize özniteliğinin özel bir özellik olmadığını anlıyorum.

+0

Evet, bu Microsoft ekibi tarafından System.Web.MVC'de oluşturulan bir sınıftır. – PaulN

3

Bir temel sınıftan miras alınan özelliklerin kaldırılması, Liskov Substitution Principle öğelerini ihlal ediyor. Bu şekilde kırılma mirası bu şekilde çirkin başını, kök problemini değiştirmek için çok geç olduktan sonra, beklenmedik ve beklenmedik sonuçlarla birlikte — yıpratır.

Bir yol olsa bile, zamanın büyük çoğunluğunu kullanmamanız gerektiğini söyleyeceğim. Mirasa alternatifler, örneğin (, mirasın yerine bir,) ya da tabanı, her ikisini de uygulayabilen ayrı bir arabirime yeniden yerleştirmek gibi uygulanabilir; hatta bunların her ikisini de birleştirin.

+0

Eh, temel sınıf kullanarak site için bir varsayılan yetki ayarlamak güzel olurdu. Sadece Yöneticiler'e izin veren 9'dan sadece 1 Denetleyicim var. Bir temel sınıf özniteliğini kaldırmak mümkün görünmediğinden, bu en doğru öneridir.[Authorize (Roller = "Kullanıcı, Yönetici, Gümrük")] 'i kaldırdım ve her denetleyicide ayarlayacağım. – PaulN

+0

Öznitelikler sınıf üyeleri gibi değildir ve mutlaka devralınmazlar (bu nedenle AttributeUsage (Inherited = false) '). Bu yüzden LSP burada geçerli değildir. –

İlgili konular