Laden...

Attribute durch Interface erzwingen?

Erstellt von AlexDozer vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.569 Views
A
AlexDozer Themenstarter:in
54 Beiträge seit 2010
vor 12 Jahren
Attribute durch Interface erzwingen?

Hi,

ich hab schon im Netz gesucht und auch hier im Forum, aber anscheinend kam noch nie jemand auf den Gedanken. Deswegen meine Frage:

Kann man in einem Interface der implementierenden Klasse vorschreiben das sie ein bestimmtes Attribut haben bzw angeben muss?

Gruß Alex

C
2.121 Beiträge seit 2010
vor 12 Jahren

Nein geht (meines Wissens) nicht. Ein Interface sagt nur, was du bei einer Klasse für Methoden aufrufen kannst.

849 Beiträge seit 2006
vor 12 Jahren

Hallo,

Nein geht nicht, aber wenn Du das abfragen der Attribute auch in deiner Hand hast, kannst Du dir per Reflection die Interfaces der Klasse holen und gucken ob da das Attribut über die Methode drüber gehauen wurd.

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo AlexDozer,

... was dann zwar eine Prüfung zur Laufzeit ist und nicht zur Compilezeit, aber da man diese Prüfung gleich am Anfang des Mains aufrufen und bei Fehlschlagen laut und vernehmlich Protesttieren kann, und das Programm sogar gleich wieder beenden, ist das fast so gut wie eine Compilezeitprüfung.

herbivore

916 Beiträge seit 2008
vor 12 Jahren

Hi AlexDozer,

ich denke das ist eine sehr gute Anwendung für AOP (z.B. PostSharp). Du könntest das also schon zur Compilezeit prüfen und sogar dynamisch das Attribut an Klassen adaptieren die das Interface implementieren aber nicht das Attribut gesetzt haben.

Again what learned...

A
AlexDozer Themenstarter:in
54 Beiträge seit 2010
vor 12 Jahren

PostSharp benutzen wir hier auf Arbeit. Muss ich mich anscheinend mal reinarbeiten. Hab selber noch nicht damit gearbeitet.

Gruß Alex

916 Beiträge seit 2008
vor 12 Jahren

Hi AlexDozer,

hier noch ein kleiner Tipp, das kann ich dir nur empfehlen mal anzuschauen. Ich glaub das ist genau das nachdem du suchst.

CustomAttributeIntroductionAspect

Again what learned...

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo AlexDozer,

alternativ und sofern möglich, könnte dann statt dem Attribut gleich das Interface verwendet werden. Hierzu z.B. im Interface die nötigen Eigenschaften definieren, die sonst mittels Attribut angegeben werden sollen.
Die "Verwertung" kann dann direkt od. auch per Reflection erfolgen.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

A
AlexDozer Themenstarter:in
54 Beiträge seit 2010
vor 12 Jahren

@gfoidl: Du meinst das ich dem Interface die Attribute vergebe? Aber dann hätten doch alle implementieren Klassen das Attribute mit dem selben Wert oder vestehe ich was falsch?

@rollerfreak2: Danke, werd ich mir ansehen!

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo AlexDozer,

Du meinst das ich dem Interface die Attribute vergebe?

Nein, das meinte ich nicht. Wenn beispielsweise folgendes Attribut vorhanden ist:


[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
public class MyAttribute : Attribute
{
    public string MyProperty { get; private set; }
    //---------------------------------------------------------------------
    public MyAttribute(string myArgument)
    {
        this.MyProperty = myArgument;
    }
}

dann könnte das auf jede Klasse gepappt werden. Dieses kann in folgende Schnittstelle umgewandelt werden:


public interface MyInterface
{
    string MyPropertey { get; }
}

Im Attribut-Fall schaut eine Klasse so aus:


[MyAttribute("irgendwas")]
public class Foo { }

Im Interface-Fall schaut die Klasse so aus:


public class Boo : IMyInterface
{
    public string MyProperty { get; private set; }

    public Boo()
    {
        this.MyProperty("irgendwas");
    }
}

So wars gemeint. Hier siehst du auch gleich den Vorteil von den Attribute, nämlich dass es deklarativer ist und über die Meta-Daten ersichtlich ist, welchen Wert MyProperty hat.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"