• C# 通过反射获取类属性标识名称


    JSON序列化的时候,往往前后端的属性名称回不一样,尤其是再调用第三方接口的时候,为了减少这方便的麻烦,一般我们在自定义实体的时候,回使用数据契约(DataContract) 

    一旦声明一个类型为DataContract,那么该类型就可以被序列化在服务端和客户端之间传送,如下所示。

    [DataContract(Name = "People")]
    public class Person
    {
        [DataMember(Name = "Name")]
        public String UserName { get; set; }
    
        [DataMember(Name = "Age")]
        public String UserAge { get; set; }
    
    }

    DataMember(数据成员)有很多属性,这里不一一讨论,主要说一下如何通过属性名获取DataMember的Name属性

    一、获取类所有属性的标记名称

            /// <summary>
            /// 获取属性标记名称
            /// </summary>
            /// <returns></returns>
            public List<String> GetAttributeSignName()
            {
                var SignNames = new List<String>();
                var MyProperties = typeof(People).GetProperties();
                foreach (var property in MyProperties)
                {
                    var attributes = property.GetCustomAttributes(typeof(DataMemberAttribute), true);
                    foreach (DataMemberAttribute dma in attributes)
                    {
                        SignNames.Add(dma.Name);
                    }
                }
                return SignNames;
            }

    二、获取指定属性名的属性标记名称

            /// <summary>
            /// 获取属性标记名称
            /// </summary>
            /// <param name="T">实体类</param>
            /// <param name="SN">属性名</param>
            /// <returns></returns>
            public String GetAttributeSignName(Person T,String SN)
            {
                var SignName = "";
                var Attribute = T.GetType().GetProperties().FirstOrDefault(e => e.Name == SN);
                var Sign = (DataMemberAttribute)Attribute.GetCustomAttributes(typeof(DataMemberAttribute), true)[0];
                SignName  = Sign.Name;
                return SignName;
            }    

    现实开发中,我们还会经常用到另一种场景

    三、属性名是字符串,获取该属性的值

    using System.Reflection;  
      
    var obj = new Person();  
    Response.Write(obj.GetType().GetProperty("UserName").GetValue()) ;

    四、通过对象的属性,获取对象的名称字符串

    using System.Linq.Expressions;  
    public string GetPropertyName<T>(Expression<Func<T,object>> expr)  
    {  
      var rtn = "";  
      if (expr.Body is UnaryExpression)  
      {  
        rtn = ((MemberExpression)((UnaryExpression)expr.Body).Operand).Member.Name;  
      }  
      else if (expr.Body is MemberExpression)  
      {  
        rtn = ((MemberExpression)expr.Body).Member.Name;  
      }  
      else if (expr.Body is ParameterExpression)  
      {  
        rtn = ((ParameterExpression)expr.Body).Type.Name;  
      }  
        return rtn;  
    }  
         
    Response.Write(GetPropertyName<Person>(p=>p.UserName)) ; //输出的是 "UserName" 八字母
    Response.Write(GetPropertyName<Person>(p=>p.UserAge)) ; //输出的是 "UserAge" 七个字母
    Response.Write(GetPropertyName<Person>(p=>p)) ; //输出的是 "Person" 六个字母

    五、通过对象的属性,获取对象的属性标记名称

    using System.Linq.Expressions;  
    
    public string GetPropertySignName<T>(Expression<Func<T, object>> expr)
    {
      var rtn = "";
      if (expr.Body is UnaryExpression)
      {
        rtn = ((MemberExpression)((UnaryExpression)expr.Body).Operand).Member.CustomAttributes.FirstOrDefault().NamedArguments.FirstOrDefault().TypedValue.Value.ToString();
      }
      else if (expr.Body is MemberExpression)
      {
        rtn = ((MemberExpression)expr.Body).Member.CustomAttributes.FirstOrDefault().NamedArguments.FirstOrDefault().TypedValue.Value.ToString();
      }
      else if (expr.Body is ParameterExpression)
      {
        rtn = ((ParameterExpression)expr.Body).Type.CustomAttributes.FirstOrDefault().NamedArguments.FirstOrDefault().TypedValue.Value.ToString();
      }
      return rtn;
    }
    
    Response.Write(GetPropertySignName<Person>(p=>p.UserName)) ; //输出的是 "Name" 四字母
    Response.Write(GetPropertySignName<Person>(p=>p.UserAge)) ; //输出的是 "Age" 三个字母
    Response.Write(GetPropertySignName<Person>(p=>p)) ; //输出的是 "People" 五个字母
  • 相关阅读:
    【火炉炼AI】机器学习003-简单线性回归器的创建,测试,模型保存和加载
    【火炉炼AI】机器学习002-标记编码方法
    【火炉炼AI】机器学习001-数据预处理技术(均值移除,范围缩放,归一化,二值化,独热编码)
    HOJ 13830 DNA Sequencing
    HDU 6078 Wavel Sequence
    hoj 13814 Cake cut
    HDU6071 Lazy Running
    HDU 6070 Dirt Ratio
    HDU 6070 Dirt Ratio
    HDU 6059 Kanade's trio
  • 原文地址:https://www.cnblogs.com/hopedilei/p/10429729.html
Copyright © 2020-2023  润新知