C#反射遍历/查询类中的属性以及值

来源:互联网 发布:sql语句建表 列名别名 编辑:程序博客网 时间:2024/06/02 02:40

遍历一个类/或类对象的属性/值,很有用,看个例子

using System;using System.Collections.Generic;using System.Linq;using System.Reflection;using System.Text;using System.Threading.Tasks;namespace ConsoleApplication13{    class Program    {        static void Main(string[] args)        {            //新建一个对象            Object o = new {name="zhifeiya",@class="myclass" };            //如果有name这个属性            if(JudgeHasProperty("name",o))            {                //输出name的值                Console.WriteLine(GetPropertyValueByName("name",o).ToString());            }            //遍历该ae对象的name/value (这是一个系统类,这里拿来测试一下)            ApplicationException ae = new ApplicationException();            ForeachPropertyValues(ae);            Console.Read();        }        /// <summary>        /// 判断 对象 中是否有该属性(不区分大小写)        /// </summary>        /// <param name="PropertyName">属性名称</param>        /// <param name="o">目标对象</param>        /// <returns></returns>        public static bool JudgeHasProperty(string PropertyName,Object o)        {            if (o == null)            {                o = new { };            }            PropertyInfo[] p1 = o.GetType().GetProperties();            bool b = false;            foreach (PropertyInfo pi in p1)            {                if (pi.Name.ToLower() == PropertyName.ToLower())               {                   b = true;               }            }            return b;        }        /// <summary>        /// 获取指定属性的值(不区分大小写)        /// </summary>        /// <param name="PropertyName">属性名称</param>        /// <param name="o">目标对象</param>        /// <returns></returns>        public static Object GetPropertyValueByName(string PropertyName, Object o)        {            if (o == null)            {                o = new { };            }            //创建一个返回对象            Object returnObject=new Object();            PropertyInfo[] p1 = o.GetType().GetProperties();            foreach (PropertyInfo pi in p1)            {                if (pi.Name.ToLower() == PropertyName.ToLower())                {                    returnObject = pi.GetValue(o);                }            }            return returnObject;        }        /// <summary>        /// 遍历属性的名称/值(显示形式:name=value)        /// </summary>        /// <param name="o"></param>        public static void ForeachPropertyValues( Object o)        {            if (o == null)            {                o = new { };            }            PropertyInfo[] p1 = o.GetType().GetProperties();            foreach (PropertyInfo pi in p1)            {                Console.WriteLine(pi.Name + ":" + pi.GetValue(o,null));            }                }    }}

运行结果:





场景案例:比如想对HtmlHelper写一个扩展的生成Button标签的方法:

        public static MvcHtmlString MyButton(this HtmlHelper h, Object HtmlAttribute)        {            if (HtmlAttribute == null)            {                HtmlAttribute = new { };            }            string str = "";            PropertyInfo[] p1 = HtmlAttribute.GetType().GetProperties();            foreach (PropertyInfo pi in p1)            {                str += "  " + pi.Name + "='" + pi.GetValue(HtmlAttribute, null).ToString() + "'   ";            }            return new MvcHtmlString( "<input type='button' " + str + " >");        }
使用的时候,在视图中,我们就可以这样直接调用了:

@Html.MyButton(new { id="but",name="butname",@class="myclass",value="submit"})
生成的html代码:

<input type='button'   id='but'     name='butname'     class='myclass'     value='submit'    >








0 0
原创粉丝点击