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

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

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

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

//T-实体类,SN属性名
public String GetAttributeSignName(Person T, String SN)
{
    var Attribute = T.GetType().GetProperties().FirstOrDefault(e => e.Name == SN);
    var Sign = (DataMemberAttribute)Attribute.GetCustomAttributes(typeof(DataMemberAttribute), true)[0];
    return Sign.Name;
}

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

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 @ 2022-05-18 11:47  publiter  阅读(969)  评论(0编辑  收藏  举报