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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM