2010-11-21 4 views
1

Nehmen wir an, wir haben eine Situation, in der wir zwei Klassen haben, ClassA und ClassB, und diese beide haben die Methode DoSomething(). ClassB enthält ein ClassA als ein Feld, und wenn ClassB.DoSomething() aufgerufen wird, delegiert es den Aufruf an ClassA.DoSomething(). Außerdem hat ClassA.DoSomething() einige Attribute darauf. So haben wir so etwas wieKönnen Sie einem C# -Mitglied die Attribute eines anderen Mitglieds in einer anderen Klasse geben?

class ClassA { 
    [SomeAttribute] 
    int DoSomething() { return 0; } 
} 

class ClassB { 
    public ClassA CA { get; } 
    int DoSomething() { return CA.DoSomething(); } 
} 

Meine Frage ist, gibt es eine Möglichkeit, die Attribute der Anwendung, die auf ClassB.DoSomething() auf ClassA.DoSomething() existieren, ohne dass Code zu wiederholen? Was passiert, wenn ClassA.DoSomething() mehrere Attribute hat? Gibt es ein Attribut, das wie folgt aussehen könnte: [ApplyAttributes(typeof(ClassA), "DoSomething")]?

Ich bin nicht auf der Suche nach Attributen dynamisch zur Laufzeit, das könnte alles zur Kompilierzeit passieren.

Dies ist für eine Silverlight-Lösung, so dass bestimmte Reflexionstechniken wie TypeDescriptors für mich nicht verfügbar sind.

+0

Gibt es eine Beziehung zwischen KlasseA und KlasseB? –

+0

Nur die Zuordnung von ClassB zu ClassA –

Antwort

2

Ich würde eine benutzerdefinierte TypeDescriptor erstellen, die verantwortlich für die Analyse Ihrer ApplyAttributes Attribut und die Rückgabe relevanter Attribute zur Laufzeit wäre.

Ich denke, es wäre einfacher zu tun als einige böse Build-Schritt, der Ihren Quellcode vor der Kompilierung ändern wird.

+0

+1, aber 'TypeDescriptor' ist eine statische versiegelte Klasse. Ich denke, Sie wollten sagen "implementieren ICustomTypeDescriptor'", das ist eine Schnittstelle erkannt und von 'TypeDescriptor' verwendet, wenn auf einem Objekt vorhanden. http://msdn.microsoft.com/en-us/library/system.componentmodel.icustyptypedescriptor.aspx –

+0

Dies scheint zu sein, was ich bin, vielen Dank (und Ihnen für die Klarstellung Wim). Ich werde dich wissen lassen, wie ich auskomme. –

+0

Ich habe einen Blick auf diesen Ansatz geworfen, aber meine Anwendung ist in Silverlight und es sieht so aus, als ob TypeDescriptor und ICustomTypeDescriptor in Silverlight nicht verfügbar sind, also werde ich dies als nicht beantwortet markieren. Jedenfalls sehen sie auf jeden Fall interessant aus. –

0

Attribute sind eine Laufzeit-Sache. Das Wissen, welche Attribute auf eine Klasse angewendet werden, erfordert eine Live-Instanz einer Klasse.

Jetzt, wenn Microsoft die Funktion "Compiler as a Service" zur Verfügung stellt, können Sie diese Informationen möglicherweise zum Zeitpunkt des Kompilierens abrufen und etwas damit tun. Wenn Sie Ihre Codedatei nicht analysieren und den C# -Code der anderen Klassen nicht ändern, gibt es im Grunde keine Möglichkeit, das zu tun, was Sie zur Kompilierungszeit tun möchten.

Wenn Ihre Klassen durch Vererbung verknüpft sind, können Sie Ihre Attribute als vererbbar definieren.

Verwandte Themen