2011-11-16 12 views
7

sto usando servizio WCFOttenere il nome di tutti i DataMembers in un DataContract

Ho un contratto dati:

[DataContract] 
[KnownType(typeof(CustomBranches))] 
public class CustomBranches 
{ 
    [DataMember] 
    public int Id { get; set; } 

    [DataMember] 
    public string branch_name { get; set; } 

    [DataMember] 
    public string address_line_1 { get; set; } 

    [DataMember] 
    public string city_name { get; set; } 
} 

E 'possibile che io possa trovare il nome di tutti i DataMembers in questa classe CustomBranches

Come "ID", "nome del ramo", ecc

Grazie

risposta

4

Visto che si tratta di una tecnica d'appalto si dovrebbe probabilmente avere tutte queste proprietà a disposizione, ma se non la seguente dovrebbe elencare tutte le proprietà del tipo:

Type T =(typeof(T)); 
var properties = T.GetProperties(BindingFlags.Public|BindingFlags.Instance); 

sostituire T con il tipo, e si è buono per andare. A seconda delle tue esigenze potresti desiderare diversi BindingFlags.

+1

Tipo tip = (typeof (T)); T non può essere sia il tipo che il nome della variabile Tipo. Anche T dovrebbe essere riservato ai tipi generici in generici. Grazie comunque per la mancia. – pasx

14

che cosa dovete fare:

  • Non è necessario aggiungere [KnownType(typeof(CustomBranches))] nella classe CustomBranches. Una classe sa sempre di se stessa.
  • è necessario filtrare le proprietà per ottenere solo quelli con l'attributo [DataMember] (codice nillls' restituito tutti)
  • Le proprietà dei membri dati possono essere anche non pubblica (funziona se la serializzazione è in esecuzione in piena fiducia)
  • I membri di dati possono anche essere campi (non solo proprietà), quindi è necessario anche tenerne conto.

Questo è un esempio di codice che fa tutti loro.

public class StackOverflow_8152252 
{ 
    public static void Test() 
    { 
     BindingFlags instancePublicAndNot = BindingFlags.Instance | 
      BindingFlags.Public | 
      BindingFlags.NonPublic; 
     var memberNames = typeof(CustomBranches) 
      .GetProperties(instancePublicAndNot) 
      .OfType<MemberInfo>() 
      .Union(typeof(CustomBranches).GetFields(instancePublicAndNot)) 
      .Where(x => Attribute.IsDefined(x, typeof(DataMemberAttribute))) 
      .Select(x => x.Name); 
     Console.WriteLine("All data member names"); 
     foreach (var memberName in memberNames) 
     { 
      Console.WriteLine(" {0}", memberName); 
     } 
    } 

    [DataContract] 
    public class CustomBranches 
    { 
     [DataMember] 
     public int Id { get; set; } 

     [DataMember] 
     public string branch_name { get; set; } 

     [DataMember] 
     public string address_line_1 { get; set; } 

     [DataMember] 
     public string city_name { get; set; } 

     public int NonDataMember { get; set; } 

     [DataMember] 
     public string FieldDataMember; 

     [DataMember] 
     internal string NonPublicMember { get; set; } 
    } 
} 
+0

Si noti che gli antenati di un tipo, se ce ne sono, hanno ciascuno il proprio attributo 'DataContract'. Quindi, per filtrare proprietà e campi, potresti voler includere il flag di vincolo 'DeclaredOnly'. In tal caso, passa anche 'inherit: false' a' IsDefined'. – HappyNomad

3

Ho modificato risposta Carlos' leggermente ignorare membri dati decorato con un attributo [NonSerialized]:

public class StackOverflow_8152252 
{ 
    public static void Test() 
    { 
     BindingFlags instancePublicAndNot = BindingFlags.Instance | 
      BindingFlags.Public | 
      BindingFlags.NonPublic; 
     var memberNames = typeof(CustomBranches) 
      .GetProperties(instancePublicAndNot) 
      .OfType<MemberInfo>() 
      .Union(typeof(CustomBranches).GetFields(instancePublicAndNot)) 
      .Where(x => Attribute.IsDefined(x, typeof(DataMemberAttribute)) 
        && !Attribute.IsDefined(x, typeof(NonSerializedAttribute))) 
      .Select(x => x.Name); 
     Console.WriteLine("All data member names"); 
     foreach (var memberName in memberNames) 
     { 
      Console.WriteLine(" {0}", memberName); 
     } 
    } 

    [DataContract] 
    public class CustomBranches 
    { 
     [DataMember] 
     public int Id { get; set; } 

     [DataMember] 
     [NonSerialized] 
     public string NonSerializedDataMember { get; set; } 
    } 
} 
Problemi correlati