2011-11-16 10 views
7

मैं WCF सेवाहो रही एक DataContract में सभी DataMembers

उपयोग कर रहा हूँ मैं एक डेटा अनुबंध राशि का नाम:

[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; } 
} 

यह संभव है कि मैं इस कक्षा में सभी DataMembers के नाम पा सकते हैं है CustomBranches

"आईडी", "शाखा का नाम" आदि की तरह

धन्यवाद

उत्तर

4

यह रूप देखकर एक डेटा अनुबंध आप सबसे अधिक संभावना इन सभी गुणों को उपलब्ध होना चाहिए है, लेकिन अगर आपके सभी टाइप गुण में सूचीबद्ध करना चाहिए का पालन नहीं कर:

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

प्रकार के साथ टी की जगह है, और आप कर रहे हैं जाना अच्छा है। आपकी जरूरतों के आधार पर आप अलग-अलग BindingFlags चाह सकते हैं।

+1

प्रकार typ = (typeof (टी)); टी प्रकार और प्रकार चर दोनों नाम नहीं हो सकता है। जेनिक्स में जेनेरिक प्रकारों के लिए टी भी आरक्षित किया जाना चाहिए। वैसे भी टिप के लिए धन्यवाद। – pasx

14

आप क्या करने की जरूरत:

  • आप अपने CustomBranches कक्षा में [KnownType(typeof(CustomBranches))] जोड़ने की जरूरत नहीं है। एक वर्ग हमेशा अपने बारे में जानता है। (Nillls 'कोड उन सभी को लौटे)
  • आप गुण फिल्टर करने के लिए केवल [DataMember] विशेषता के साथ उन प्राप्त करने की आवश्यकता
  • डेटा सदस्य गुण भी गैर सरकारी (यह काम करता है अगर क्रमबद्धता पूर्ण विश्वास में चल रहा है हो सकता है)
  • डेटा सदस्य फ़ील्ड भी हो सकते हैं (न केवल गुण), इसलिए आपको उनके लिए भी खाते की आवश्यकता है।

यह एक कोड का एक उदाहरण है जो उन सभी को करता है।

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

ध्यान दें कि एक प्रकार के पूर्वजों, यदि कोई हैं, तो प्रत्येक के पास अपनी 'डेटाकंट्रैक्ट' विशेषता है। तो गुणों और क्षेत्रों को फ़िल्टर करने के लिए, आप 'अस्वीकृत केवल' बाध्यकारी ध्वज शामिल करना चाह सकते हैं। उस स्थिति में, 'IsDefined' को 'उत्तराधिकारी: झूठी' भी पास करें। – HappyNomad

3

मैं कार्लोस 'जवाब को संशोधित किया है थोड़ा एक [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; } 
    } 
} 
संबंधित मुद्दे