2010-01-18 23 views
5

Salut les gars J'ai une classe très simple appelée personne.WCF Read DataMembre Attribut Nom

public class Person{ 
    [DataMember(Name="MyName")] 
    public string Name { get;set;} 
} 

Si j'essaie de sérialiser ou de dé-sérialiser, tout fonctionne très bien. Dans le XML, je peux voir une étiquette appelée "MyName" et dans l'objet que je vois avec le VS Intellisense une propriété appelée Name. Ce dont j'ai besoin maintenant, c'est d'accéder, à partir de l'objet, au nom sérialisé de la propriété. Par exemple, je peux faire cet object.GetType(). GetProperty ("Name"); mais si j'essaie de faire ce object.GetType(). GetProperty ("MyName") la réflexion dit que la propriété n'existe pas. Comment je peux lire le nom sérialisé de la propriété? Y a-t-il un moyen?

+0

Essayez-vous de le faire du côté du service ou du côté client? –

+0

Du côté client, DataContractSerializer ne peut pas lire l'attribut de la propriété. J'ai aussi essayé avec XDocument et Linq. Aucune suggestion? – Raffaeu

Répondre

3

Il semble que le seul moyen est d'accéder, en utilisant la réflexion, les attributs de la propriété de cette façon:

var att = myProperty.GetType().GetAttributes(); 
var attribute = property.GetCustomAttributes(false)[0] as DataMemberAttribute; 
Console.WriteLine(attribute.Name); 

Cela fonctionne à la fois, le client et le serveur, sans avoir besoin de sérialisation et la désérialisation la objet.

+1

certaines vérifications nuls peuvent être dans l'ordre, votre réponse suppose un seul attribut, essayez de vérifier comme suit: 'var attribut = (DataMemberAttribute) propertyInfo.GetCustomAttributes (typeof (DataMemberAttribute), false) .FirstOrDefault(); \t \t \t \t si (attribut = null!) \t \t \t \t \t name = attribute.Name; ' – Myster