zoukankan      html  css  js  c++  java
  • 通过反射获取struct中定义的Field的名称和值 Anny

    下面的代码是利用反射获取类或结构的Field和Property,其中,需要注意的是,当使用反射为结构的Field设置值时,不能使用SetValue方法,而是使用SetValueDirect(),FieldInfo.SetValue (Not work with Structure),具体如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Reflection;
    using System.Data;
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {           
                DataTable dt = GetFiledNames();
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    Console.WriteLine(dt.Columns[i].Caption);
                }
                dt.Rows[1][0] = 1;
                dt.Rows[1][1] = 2;
                Point p = GetFieldValues(dt);
                Console.WriteLine("{0},{1}", p.x, p.y);

                Console.Read();
            }
           
            private static DataTable GetPropertyNames()
            {
                PropertyInfo[] propertyInfos;           
                propertyInfos = typeof(Point).GetProperties();
                DataTable dt = new DataTable();
                int i = 0;

                foreach (PropertyInfo item in propertyInfos)
                {
                    dt.Columns.Add();
                    dt.Columns[i].Caption = item.Name;
                    dt.Columns[i].DataType = item.PropertyType;
                    i++;
                }
                for (int j = 0; j < 2; j++)
                {
                    DataRow dr = dt.NewRow();
                    dt.Rows.Add(dr);
                }

                return dt;
            }
           
            private static Point GetPropertyValues(DataTable dt)
            {
                PropertyInfo[] propertyInfos;
                propertyInfos = typeof(Point).GetProperties();

                Point p = new Point();
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    propertyInfos[i].SetValue(p, dt.Rows[1][i], null);

                }
                return p;
            }

            private static DataTable GetFiledNames()
            {
                FieldInfo[] fieldInfos;
                fieldInfos = typeof(Point).GetFields();
                DataTable dt = new DataTable();
                int i = 0;

                foreach (FieldInfo item in fieldInfos)
                {
                    dt.Columns.Add();
                    dt.Columns[i].Caption = item.Name;
                    dt.Columns[i].DataType = item.FieldType;
                    i++;
                }
                for (int j = 0; j < 2; j++)
                {
                    DataRow dr = dt.NewRow();
                    dt.Rows.Add(dr);
                }

                return dt;
            }

            private static Point GetFieldValues(DataTable dt)
            {
                FieldInfo[] fieldInfos;
                fieldInfos = typeof(Point).GetFields();

                Point p = new Point();
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    fieldInfos[i].SetValueDirect(__makeref(p), dt.Rows[1][i]);

                }
                return p;
            }
        }

        public struct Point
        {
            public int x;
            public int y;
            //public int x { get; set; }
            //public int y { get; set; }       
        }   
    }

    参考资料:

    http://connect.microsoft.com/VisualStudio/feedback/details/88486/fieldinfo-setvalue-not-work-with-structure

    http://msdn.microsoft.com/zh-cn/library/system.data.datatable.newrow(VS.80).aspx

    http://www.csharp-examples.net/reflection-property-names/

  • 相关阅读:
    [转]PostgreSQL数据类型
    Linux下执行自定义的可执行命令无效原因
    [其它]iOS 12.2支持电信VoLTE了,中国电信教你如何开通:只要三步
    本机无法访问虚拟机里面的nginx的80端口
    百度的网络接入架构图
    如何让局域网中的其他主机访问虚拟机
    java中synchronized 用在实例方法和对象方法上面的区别
    Redis登陆服务器和批量删除指定的key
    vim查找关键字的好方法
    网络攻防之动态修改表单的值
  • 原文地址:https://www.cnblogs.com/limei/p/1860818.html
Copyright © 2011-2022 走看看