2011-11-16 71 views
7

我使用WCF服务获得在DataContract所有数据成员

我有一个数据合同名称:

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

是否有可能,我可以在这个类中找到的所有数据成员的名字CustomBranches

像 “ID”, “支行名称” 等

感谢

回答

4

看到,因为它是一个数据的合同,你应该最有可能拥有所有这些特性可用,但如果没有下面应该列出你的类型的所有属性:

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

用型替代T,和你很好去。根据您的需要,您可能需要不同的BindingFlags

+1

类型典型值=(typeof运算(T)); T不能既是类型又是类型变量名称。 T也应该保留为泛型中的泛型类型。无论如何感谢提示。 – pasx

14

你需要做的:

  • 你并不需要在您的CustomBranches类添加[KnownType(typeof(CustomBranches))]。一个班总是知道自己。
  • 您需要过滤的属性,只让那些与[DataMember]属性(nillls'代码全都归还)
  • 数据成员的属性也可以是非公共的(它的工作原理,如果序列化是在完全信任运行)
  • 数据成员也可以是字段(不仅是属性),所以你也需要考虑它们。

这是一个代码的例子,它执行所有的操作。

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

请注意,类型的祖先(如果有的话)都有自己的'DataContract'属性。因此,对于过滤属性和字段,您可能需要包含'DeclaredOnly'绑定标志。在这种情况下,还要将'inherit:false'传递给'IsDefined'。 – HappyNomad

3

我已经修改Carlos的答案略微忽略数据成员饰以[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; } 
    } 
}