Puis-je arrêter mon WCF générer ArrayOfString au lieu de string[] ou List<string>
Je vais avoir un problème mineur avec WCF service des procurations où le message contient List<string>
en tant que paramètre.
Je suis en utilisant le 'Ajouter une référence de Service" dans Visual Studio pour générer une référence à mon service.
//portion of my web service message
public List<SubscribeInfo> Subscribe { get; set; }
public List<string> Unsubscribe { get; set; }
Ce sont les propriétés générées sur mon MsgIn
pour l'un de mes méthodes web.
Vous pouvez le voir utilisé ArrayOfString
quand je suis en utilisant List<string>
, et l'autre prend List<SubscribeInfo>
- qui correspond à mon origine C# de l'objet ci-dessus.
[System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false)]
public System.Collections.Generic.List<DataAccess.MailingListWSReference.SubscribeInfo> Subscribe {
get {
return this.SubscribeField;
}
set {
if ((object.ReferenceEquals(this.SubscribeField, value) != true)) {
this.SubscribeField = value;
this.RaisePropertyChanged("Subscribe");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false)]
publicDataAccess.MailingListWSReference.ArrayOfString Unsubscribe {
get {
return this.UnsubscribeField;
}
set {
if ((object.ReferenceEquals(this.UnsubscribeField, value) != true)) {
this.UnsubscribeField = value;
this.RaisePropertyChanged("Unsubscribe");
}
}
}
La ArrayOfString classe générée ressemble à ceci. C'est une classe générée dans mon code, ce n'est pas un .NET de la classe. Il en fait généré en moi une classe qui hérite de la Liste, mais je n'avais pas la "décence" pour créer des me toute les constructeurs.
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
[System.Runtime.Serialization.CollectionDataContractAttribute(Name="ArrayOfString", Namespace="http://www.example.com/", ItemName="string")]
[System.SerializableAttribute()]
public class ArrayOfString : System.Collections.Generic.List<string> {
}
Le problème est que j'ai souvent créer mon message comme ceci :
client.UpdateMailingList(new UpdateMailingListMsgIn()
{
Email = model.Email,
Name = model.Name,
Source = Request.Url.ToString(),
Subscribe = subscribeTo.ToList(),
Unsubscribe = unsubscribeFrom.ToList()
});
J'aime vraiment le look propre, cela me donne.
Maintenant pour le problème réel :
Je ne peux pas attribuer un List<string>
à la Unsubscribe
propriété qui est un ArrayOfString
- même si il hérite de la Liste. En fait, je ne peux pas l'air de trouver QUELQUE sorte de l'attribuer sans supplément de déclarations.
J'ai essayé ce qui suit :
new ArrayOfString(unsubscribeFrom.ToList())
- ce constructeur n'existe pas 🙁- de changer le type de la matrice utilisée par le générateur de code - ne fonctionne pas - il me donne toujours ArrayOfString (!?)
- essayez de lancer
List<string>
àArrayOfString
- échoue avec "impossible de lancer', même si il compile un peu fine - créer
new ArrayOfString()
et puisAddRange(unsubscribeFrom.ToList())
- fonctionne, mais je ne peux pas tout faire en une seule instruction - créer une fonction de conversion
ToArrayOfString(List<string>)
, qui fonctionne, mais n'est pas aussi propre que je veux.
Son seul de le faire pour de chaîne, ce qui est ennuyeux.
Suis-je raté quelque chose? Est-il un moyen de lui dire de ne pas générer ArrayOfString
- ou de quelque autre truc pour l'attribuer ?
OriginalL'auteur Simon_Weaver | 2009-02-03
Vous devez vous connecter pour publier un commentaire.
Tout .NET objet qui implémente une méthode nommée "Ajouter" peut être initialisé comme des tableaux ou des dictionnaires.
Comme ArrayOfString ne mettre en œuvre une "Ajouter" de la méthode, vous pouvez l'initialiser comme ceci:
Mais, si vous voulez vraiment pour initialiser la base d'un autre collection, vous pouvez écrire une méthode d'extension pour:
Utilisation:
OriginalL'auteur Fábio Batista
Je préfère ne pas revenir types génériques à travers un service de limite à la première place. Au lieu de retourner de Désabonnement comme un
string[]
, et SubscriptionInfo commeSubscriptionInfo[]
. Si nécessaire, un tableau peut être facilement converti en une liste générique sur le client, comme suit:OriginalL'auteur JulianM
Trop tard, mais peut aider les gens dans le futur...
Utiliser le svcutil et informer explicitement de la ligne de commande util que vous voulez que la classe proxy pour être sérialisé par la XmlSerializer et pas le DataContractSerializer (par défaut). Voici l'exemple:
svcutil /: c:\Chemin\Proxy.cs /config:c:\Chemin\Proxy.config /async /sérialiseur:XmlSerializer /espace de noms:*,YourNamespace http://www.domain.com/service/serviceURL.asmx
Noter que le service web est un ASP.NET service web ok?!
Il a en effet d'aider les gens dans le futur, merci monsieur!
OriginalL'auteur Fergara
Si vous utilisez VS 2008 à consommer de service, alors il ya une solution facile.
Cliquez sur le bouton "Avancé..." sur le formulaire de procuration boîte de dialogue qui s'affiche lorsque vous ajoutez une Référence de Service. Dans la Collection de Type liste déroulante, vous pouvez sélectionner le Système.Génériques.Liste. Les méthodes retournant Liste devrait maintenant fonctionner correctement.
(Espérons que c'est ce que vous demandez, je suis un peu fatigué et que la question est un peu difficile pour moi de lire.)
hmm. je dois le tester. malheureusement, mon horaire de travail est un peu mouvementé aujourd'hui
J'ai trouvé cela pas de travail.
OriginalL'auteur Sailing Judo