获取DataContract中所有DataMembers的名称

G.S*_*gal 7 c# asp.net wcf

我正在使用WCF服务

我有数据合同:

[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; }
}
Run Code Online (Sandbox Code Playgroud)

是否有可能在此类CustomBranches中找到所有DataMembers的名称

比如"ID","分支名称"等

谢谢

car*_*ira 14

你需要做什么:

  • 您不需要[KnownType(typeof(CustomBranches))]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; }
    }
}
Run Code Online (Sandbox Code Playgroud)


nil*_*lls 4

由于它是一个数据契约,您很可能应该拥有所有可用的属性,但如果没有,以下应该列出您类型的所有属性:

Type T =(typeof(T));
var properties = T.GetProperties(BindingFlags.Public|BindingFlags.Instance);
Run Code Online (Sandbox Code Playgroud)

将 T 替换为类型,然后就可以开始了。根据您的需要,您可能需要不同的BindingFlags