• 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" 五个字母
  • 相关阅读:
    回家了
    AMP > Chapter 3 Concurrent Objects > Notes<1>
    Readings in Database Systems
    读书笔记:《Transaction Processing》Chapter 13 Buffer Management

    委托和事件的区别
    .net网页不完整的解决方案
    聚集索引,非聚集索引
    固定宽度下拉列表中option内容显示不全问题解决方法
    让你的Windows系统自动释放系统资源
  • 原文地址:https://www.cnblogs.com/publiter/p/16284134.html
Copyright © 2020-2023  润新知