国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

定義通用的可通過lambda表達(dá)式樹來獲取屬性信息

2019-11-17 02:25:43
字體:
供稿:網(wǎng)友

定義通用的可通過lambda表達(dá)式樹來獲取屬性信息

我們一般獲取某個(gè)類型或?qū)ο蟮膶傩孕畔⒕捎靡韵聨追N方法:

一、通過類型來獲取屬性信息var p= typeof(People).Get

這兩種方法都有其弊端,第一種與第二種方法,在獲取單個(gè)屬性信息時(shí),都需要硬編碼寫入常量屬性名稱,這樣在編譯時(shí)并不會報(bào)錯(cuò),只有在運(yùn)行時(shí)才知道異常,第二種方法若只是需要獲取屬性的類型名稱等基本信息,不需要屬性的值,就不需要實(shí)例化類型。

鑒于以上原因,我定義了通用的可通過lambda表達(dá)式樹來獲取屬性信息,使用方便,能解決上述問題,且有智能提示,若出現(xiàn)錯(cuò)誤,編譯時(shí)就能報(bào)出,方法定義代碼如下:

        /// <summary>        /// 獲取指定屬性信息(非String類型存在裝箱與拆箱)        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="select"></param>        /// <returns></returns>        public static PropertyInfo GetPropertyInfo<T>(Expression<Func<T,dynamic>> select)         {            var body = select.Body;            if (body.NodeType == ExpressionType.Convert)            {                var o = (body as UnaryExpression).Operand;                return (o as MemberExpression).Member as PropertyInfo;            }            else if (body.NodeType == ExpressionType.Memberaccess)            {                return (body as MemberExpression).Member as PropertyInfo;            }            return null;        }        /// <summary>        /// 獲取指定屬性信息(需要明確指定屬性類型,但不存在裝箱與拆箱)        /// </summary>        /// <typeparam name="T"></typeparam>        /// <typeparam name="TR"></typeparam>        /// <param name="select"></param>        /// <returns></returns>        public static PropertyInfo GetPropertyInfo<T, TR>(Expression<Func<T, TR>> select)        {            var body = select.Body;            if (body.NodeType == ExpressionType.Convert)            {                var o = (body as UnaryExpression).Operand;                return (o as MemberExpression).Member as PropertyInfo;            }            else if (body.NodeType == ExpressionType.MemberAccess)            {                return (body as MemberExpression).Member as PropertyInfo;            }            return null;        }        /// <summary>        /// 獲取類型的所有屬性信息        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="select"></param>        /// <returns></returns>        public static PropertyInfo[] GetPropertyInfos<T>(Expression<Func<T,dynamic>> select)        {            var body = select.Body;            if (body.NodeType == ExpressionType.Parameter)            {               return (body as ParameterExpression).Type.GetProperties();            }            else if(body.NodeType==ExpressionType.New)            {                return (body as NewExpression).Members.Select(m => m as PropertyInfo).ToArray();            }            return null;        }

使用很簡單:

// People類型定義class People    {        public string Name        { get; set; }        public int Age        { get; set; }        public string Sex        { get; set; }        public bool IsBuyCar        { get; set; }        public DateTime? Birthday        { get; set; }    }//以下是使用方法:var p = GetPropertyInfo<People>(t => t.Age);//獲取指定屬性var ps1 = GetPropertyInfos<People>(t => t);//獲取類型所有屬性var ps2 = GetPropertyInfos<People>(t => new { t.Name, t.Age });//獲取部份屬性

  

注意dynamic類型也存在裝箱與拆箱的問題,詳見這篇博文:http://m.survivalescaperooms.com/yank/p/4177619.html


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 昌平区| 来宾市| 达尔| 潮州市| 张北县| 黎城县| 郯城县| 金溪县| 榆社县| 普格县| 沾化县| 扬州市| 九台市| 陵水| 开化县| 大安市| 蒙城县| 常山县| 昭平县| 玉溪市| 湘潭市| 乐都县| 巫溪县| 北海市| 德安县| 运城市| 阳谷县| 南充市| 兴安县| 宜兰市| 鞍山市| 湘潭县| 偃师市| 巫溪县| 大冶市| 孝感市| 满洲里市| 桃源县| 梅州市| 巨鹿县| 江北区|