通过反射获取struct中定义的Field的名称和值
2010-10-25 22:29
309 查看
下面的代码是利用反射获取类或结构的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/
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/
相关文章推荐
- Java 通过反射获取一个Field对象的泛型类型
- Android中通过反射获取资源Id(特别用在自己定义一个工具将其打成.jar包时,特别注意资源的获取)
- Android 通过resource名称或者layout中定义的id name 去获取R.java中id,得到控件
- Android中通过反射获取资源Id(特别用在自己定义一个工具将其打成.jar包时,特别注意资源的获取)
- 通过反射获取类中的属性,并且将类中的属性名称以及对应的值赋给另一个类中的对象
- 怎么通过反射的方式获取指定变量名称的值呢?比如说一个const类型的常量:const string aa=123
- java反射获取实体类的属性名和值通过POI导出EXCEl,并实现表格列宽度自适应
- web developer tips (83):通过反射从堆栈里获取调用的方法名称
- Java反射代码--01.通过类名称加载一个类并且获取当前类实例
- 利用反射R文件,通过资源名称获取ID
- web developer tips (83):通过反射从堆栈里获取调用的方法名称
- java 通过反射获取方法参数列表名称
- 通过反射获取对象的属性和值
- web developer tips (83):通过反射从堆栈里获取调用的方法名称
- Golang 通过反射获取方法名称
- 通过java反射得到javabean的属性名称和值参考
- J2SE_通过反射能获取方法参数名称吗?
- 获取Delphi中定义的枚举类型的名称和值
- Java——通过反射获取函数参数名称
- asp.net通过反射获取类中定义的枚举