2011-11-16 38 views
7

Tôi đang sử dụng dịch vụ WCFBắt tên của tất cả các datamembers trong một DataContract

Tôi có một hợp đồng dữ liệu:

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

Có thể rằng tôi có thể tìm ra tên của tất cả các datamembers trong lớp này CustomBranches

Giống như "ID", "tên chi nhánh" vv

Cảm ơn

Trả lời

4

Thấy như đó là một dữ liệu hợp đồng nhiều khả năng bạn nên có tất cả các đặc tính có sẵn, nhưng nếu không phải là sau nên liệt kê tất cả các thuộc tính của kiểu của bạn:

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

thay thế T với loại, và bạn tốt để đi. Tùy thuộc vào nhu cầu của bạn, bạn có thể muốn khác nhau BindingFlags.

+1

Loại typ = (typeof (T)); T không thể là cả loại và tên biến Loại. Ngoài ra T nên được dành riêng cho các loại generic trong generics. Cảm ơn cho tip anyway. – pasx

14

Những gì bạn cần làm:

  • Bạn không cần phải thêm [KnownType(typeof(CustomBranches))] trong lớp CustomBranches của bạn. Một lớp luôn biết về bản thân nó.
  • Bạn cần lọc các thuộc tính để chỉ nhận các thuộc tính với thuộc tính [DataMember] (mã nillls 'trả lại tất cả)
  • Thuộc tính thành viên dữ liệu cũng có thể không công khai (hoạt động nếu tuần tự đang chạy hoàn toàn)
  • Thành viên dữ liệu cũng có thể là các trường (không chỉ thuộc tính), vì vậy bạn cũng cần phải tính đến chúng.

Đây là ví dụ về mã thực hiện tất cả chúng.

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

Lưu ý rằng tổ tiên của một loại, nếu có, mỗi tổ tiên có thuộc tính 'DataContract' riêng của chúng. Vì vậy, để lọc các thuộc tính và các trường, bạn có thể muốn bao gồm cờ ràng buộc 'DeclaredOnly'. Trong trường hợp đó, cũng chuyển 'inherit: false' thành' IsDefined'. – HappyNomad

3

tôi đã sửa đổi Carlos' câu trả lời hơi để bỏ qua dữ liệu thành viên được trang trí với một thuộc tính [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; } 
    } 
} 
Các vấn đề liên quan