2010-10-01 14 views
13
public class MyWebControl { 

    [ExternallyVisible] 
    public string StyleString {get;set;} 

} 

public class SmarterWebControl : MyWebControl { 

    [ExternallyVisible] 
    public string CssName{get;set;} 

    new public string StyleString {get;set;} //Doesn't work 

} 

Ist es möglich, das Attribut in der Unterklasse zu entfernen? Ich möchte, dass das Attribut von anderen Unterklassen vererbt wird, nur nicht von diesem.C# Ein Attribut in einer Unterklasse überschreiben

Edit: Whoops, sieht aus wie ich vergessen habe zu kompilieren oder etwas, weil der Code wie oben gepostet tatsächlich funktioniert!

+0

froh, das funktioniert, war ich verwirrt, warum wäre es nicht. Muss ich sagen, ich bin mir nicht sicher, ob ich die Verwendung von neuen hier mag (obwohl ich im Allgemeinen anti - neu im Allgemeinen bin). Wenn jemand die Klasse betrachtet, sagt er ihnen nicht, warum Sie das tun. Mit einem Attribut mit einem falschen Parameter auf der anderen Seite ist selbst Dokumentieren imho –

+0

True, und wenn ich das ganze Ding von Grund auf neu schreiben würde ich es wahrscheinlich so tun;) –

Antwort

5

Es funktioniert für mich.

Prüfregeln:

public static void Main() 
{ 
    var attribute = GetAttribute(typeof (MyWebControl), "StyleString", false); 
    Debug.Assert(attribute != null); 

    attribute = GetAttribute(typeof(SmarterWebControl), "StyleString", false); 
    Debug.Assert(attribute == null); 

    attribute = GetAttribute(typeof(SmarterWebControl), "StyleString", true); 
    Debug.Assert(attribute == null); 
} 

private static ExternallyVisibleAttribute GetAttribute(Type type, string propertyName, bool inherit) 
{ 
    PropertyInfo property = type.GetProperties().Where(p=>p.Name.Equals(propertyName, StringComparison.OrdinalIgnoreCase)).FirstOrDefault(); 

    var list = property.GetCustomAttributes(typeof(ExternallyVisibleAttribute), inherit).Select(o => (ExternallyVisibleAttribute)o); 

    return list.FirstOrDefault(); 
} 
13

Dies ist genau, warum Framework-Attribute, die "überschrieben" werden können, einen booleschen Parameter nehmen, der (auf den ersten Blick) sinnlos erscheint. Nehmen Sie zum Beispiel BrowsableAttribute; der Boolesche Parameter mit dem Namen veraltet Beurteilungs zu sein scheint, aber nehmen Sie dieses Beispiel:

class SomeComponent 
{ 
    [Browsable(true)] 
    public virtual string SomeInfo{get;set;} 
} 

class SomeOtherComponent : SomeComponent 
{ 
    [Browsable(false)] // this property should not be browsable any more 
    public override string SomeInfo{get;set;} 
} 

so, Ihre Frage zu beantworten, könnten Sie Ihr ExternallyVisible Attribut nimmt einen Booleschen Parameter machen, um anzuzeigen, ob es tatsächlich von außen ist sichtbar, und wenn Sie erben, können Sie auf falsch ändern - genau wie BrowsableAttribute.

2

Sie können das Attribut erben und eine Eigenschaft hinzufügen, die steuert, ob der Attrbiute-Code ausgelöst wird oder nicht.

Dann können Sie das Verhalten der Attribute in der geerbten Klasse überschreiben?

so würden Sie verwenden (wenn Sie einen Parameter an den Konstruktor hinzugefügt) verwendet

[ExternallyVisible(false)] 

[ExternallyVisible(Enabled = false)] 

i fyou eine Eigenschaft von

in der atrtibute Klasse aktiviert
3

Ich verstehe nicht, was das Problem ist. Ihr veröffentlichter Code führt die erwartete Sache (zumindest, was es scheint, dass Sie es erwarten) in meinem Test: das StyleString Eigentum hat das ExternallyVisible Attribut nicht. Hier ist mein Testcode:

[AttributeUsage(AttributeTargets.Property)] 
public class ExternallyVisible : Attribute 
{ 
} 

public class MyWebControl 
{ 
    [ExternallyVisible] 
    public string StyleString { get; set; } 
} 

public class SmarterWebControl : MyWebControl 
{ 

    [ExternallyVisible] 
    public string CssName { get; set; } 

    new public string StyleString { get; set; } //Doesn't work 

} 

class Program 
{ 
    static void Main() 
    { 
     MyWebControl myctrl = new MyWebControl(); 
     SmarterWebControl smartctrl = new SmarterWebControl(); 

     MemberInfo info = typeof(SmarterWebControl); 
     PropertyInfo[] props = (typeof(SmarterWebControl)).GetProperties(); 
     Console.WriteLine("{0} properties", props.Length); 

     foreach (var prop in props) 
     { 
      Console.WriteLine(prop.Name); 
      foreach (var attr in prop.GetCustomAttributes(true)) 
      { 
       Console.WriteLine(" " + attr); 
      } 
     } 

     Console.ReadLine(); 
    } 

} 

In .NET 4.0, erhalte ich diese Ausgabe:

2 properties 
CssName 
    sotesto.ExternallyVisible 
StyleString 

Mit anderen Worten, wird das Attribut nicht angewandt auf die StyleString Eigenschaft.

+0

Beat mich dazu. :) –

Verwandte Themen