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" 五个字母

 

posted on 2019-02-25 11:01  紫炎  阅读(7018)  评论(0编辑  收藏  举报