Wie kann ein bekannter WCF-Typ in der generischen Konfiguration angegeben werden?

8

Ich habe einen Typ, nennen wir es Data<TKey> . Ich habe auch einen WCF-Service-Vertrag, der einen Typ akzeptiert (nennen wir es Wrapper ) mit einer Eigenschaft vom Typ Object (aus Gründen, auf die ich nicht eingehen werde, ist dies nicht optional).

%Vor%

Im Moment sende ich zwei Klassen IntData und LongData :

%Vor%

Sie sind beide in der bekannten Konfigurationsdatei konfiguriert. Die Konfiguration ähnelt etwa so:

%Vor%

An diesem Punkt funktioniert alles gut.

Aber ich bin dabei, einen dritten Typ hinzuzufügen, und ich mag es nicht, die unnötigen, leeren .NET-Klassen IntData und LongData zu haben. Sie existieren nur, weil ...

Ich kann keine generischen Typen in der WCF-Konfiguration angeben!

Ich möchte so etwas machen, kenne aber die genaue Syntax nicht.

%Vor%

Was ist die korrekte Syntax dafür?

(Beachten Sie auch, dass ich [KnownType(...)] Attribute nicht auf Wrapper setzen kann, da es nicht mein Typ ist. Config scheint der einzige Weg zu sein.)

BEARBEITEN

@ barettas Antwort hat gut funktioniert. Beachten Sie jedoch, dass ich anfangs diesen Fehler erhalten habe:

  

Typ 'MyAssembly.Data'1 [System.Int64]' kann nicht zu einer Liste bekannter Typen hinzugefügt werden, da ein anderer Typ 'MyAssembly.Data'1 [System.Int32]' mit demselben Datenvertragsnamen ' Ссылка ist bereits vorhanden.

Ich habe es in der ursprünglichen Frage nicht erwähnt, aber mein Typ hat einen expliziten Datenvertragsnamen. Etwas wie das:

%Vor%

Der obige Fehler ist aufgetreten, bis ich den Name -Eigenschaftswert aus dem Attribut entfernt habe. Hoffe, dass das auch jemand anderen hilft. Ich weiß nicht, welches Format in diesem Szenario funktioniert. Diese haben nicht:

%Vor%

Weiß jemand, wie man das macht?

BEARBEITEN 2

Nochmals vielen Dank an @baretta, der darauf hingewiesen hat, dass die korrekte Syntax tatsächlich lautet:

%Vor%     
Drew Noakes 10.06.2009, 16:44
quelle

2 Antworten

18

Ein generischer Typ ist aus einer Zeichenkette instanziierbar, wenn die Zeichenkette diesem Muster folgt: Klassenname, gefolgt von einem "" -Zeichen, gefolgt von der Anzahl der Typparameter (in diesem Fall 1), gefolgt von den Typparametern in "[]" und der Verwendung von Komma als Typtrennzeichen .

%Vor%

Bearbeiten: Ich könnte auch hinzufügen, dass, wenn Assembly-Informationen für die Typparameter angegeben werden müssen (obwohl dies für stuff in mscorlib nicht der Fall ist), geschachteltes "[]" verwendet wird.

%Vor%

Bearbeiten: Sie können Namen allgemeiner Typen in Datenverträgen mit dem Zeichenfolgenformatmuster anpassen.

%Vor%

Standardmäßig wird der Name für die Daten & lt; Int32 & gt; Typ ist etwas wie "DataOfInt32HJ67AK7Y", wobei "HJ67AK7Y" ist ein Hash, der aus der Zeichenfolge "urn: default" oder dem Namespace Ihrer Klasse generiert wird, sofern vorhanden. Aber "Data {0}" würde ihm den Namen "DataInt32" geben.

Weitere hier . Sehen Sie sich den Abschnitt "Anpassen von Datenvertragsnamen für generische Typen" auf der Seite an.

    
baretta 10.06.2009, 17:22
quelle
5

Von hier ...

  

Bekannt   Typen können auch in der Konfiguration als definiert werden   unten gezeigt.

%Vor%
  

Die obige Konfiguration gibt an, dass   generischer Parameter für Circle ist der   Gleich wie der generische Parameter für die   deklarierter Typ Form. Die Konfiguration erlaubt   die Definition der bekannten Art von   willkürliche Komplexität. Zum Beispiel wenn   es ist notwendig zu definieren   Kreis & lt; Wörterbuch & lt; Zeichenfolge, T & gt; & gt; als die   bekannter Typ der Form & lt; T & gt; (natürlich das   ist rein akademisch) es kann als getan werden   folgt.

%Vor%
  

Beachten Sie das use config-Element   "Parameter" mit den Attributen "type"   und 'index'.

    
Steve Dignan 10.06.2009 17:11
quelle

Tags und Links