实例属性的读取与设置
2013-08-16 15:50
176 查看
玩转动态编译 - 高级篇:三,实例属性的读取与设置
实例属性的读取
先来回顾下静态属性读取的IL代码:
C#代码
string AAA()
{
return MyClass.Name;
}
C#代码
C#代码
string AAA(MyClass my)
{
return my.Name;
}
C#代码
C#代码
public class User
{
public User()
{
}
public int Id { get; set; }
public string Name { get; set; }
public bool Sex { get; set; }
public Guid Uid { get; set; }
public DateTime Time { get; set; }
public string SexText
{
get
{
return Sex ? "男" : "女";
}
set
{
Sex = (value == "男");
}
}
}
//模拟方法
static public DataSet GetDataSet(string sql)
{
DataTable table = new DataTable("User");
table.Columns.Add("Id", typeof(int));
table.Columns.Add("Name", typeof(string));
table.Columns.Add("Sex", typeof(bool));
table.Columns.Add("Uid", typeof(Guid));
table.Columns.Add("Time", typeof(DateTime));
table.Columns.Add("多出来的属性", typeof(string));
for (int i = 0; i < 20; i++)
{
table.Rows.Add(i, "blqw" + i, true, Guid.NewGuid(), DateTime.Now, "多余的");
}
DataSet ds = new DataSet();
ds.Tables.Add(table);
return ds;
}
C#代码
C#代码
static public List<T> ConvertToModels2<T>(DataSet ds)
where T : new()
{
var prop = ObjectProperty.GetProperties(typeof(T));
List<T> list = new List<T>(ds.Tables[0].Rows.Count);
var cols = ds.Tables[0].Columns;
foreach (DataRow row in ds.Tables[0].Rows)
{
T m = new T();
foreach (var p in prop)
{
if (cols.Contains(p.Info.Name))
{
var val = row[p.Info.Name];
if (Convert.IsDBNull(val) == false)
{
p.Info.SetValue(m, val, null);//这里直接用反射的SetValue
}
}
}
list.Add(m);
}
return list;
}
反射代码
反射代码
这只是构造10000个只有5个属性的实体类而已
因为先运行的是动态编译IL的测试,所以缓存什么的都已经在这个时候建好了,下面反射只是调用缓存
如果这个测试还看不出太大区别的话,那就看下直接对比Set部分的性能
一般来说是6倍左右的性能差异
实例属性的读取
先来回顾下静态属性读取的IL代码:
C#代码
string AAA()
{
return MyClass.Name;
}
C#代码
C#代码
string AAA(MyClass my)
{
return my.Name;
}
C#代码
C#代码
public class User
{
public User()
{
}
public int Id { get; set; }
public string Name { get; set; }
public bool Sex { get; set; }
public Guid Uid { get; set; }
public DateTime Time { get; set; }
public string SexText
{
get
{
return Sex ? "男" : "女";
}
set
{
Sex = (value == "男");
}
}
}
//模拟方法
static public DataSet GetDataSet(string sql)
{
DataTable table = new DataTable("User");
table.Columns.Add("Id", typeof(int));
table.Columns.Add("Name", typeof(string));
table.Columns.Add("Sex", typeof(bool));
table.Columns.Add("Uid", typeof(Guid));
table.Columns.Add("Time", typeof(DateTime));
table.Columns.Add("多出来的属性", typeof(string));
for (int i = 0; i < 20; i++)
{
table.Rows.Add(i, "blqw" + i, true, Guid.NewGuid(), DateTime.Now, "多余的");
}
DataSet ds = new DataSet();
ds.Tables.Add(table);
return ds;
}
C#代码
C#代码
static public List<T> ConvertToModels2<T>(DataSet ds)
where T : new()
{
var prop = ObjectProperty.GetProperties(typeof(T));
List<T> list = new List<T>(ds.Tables[0].Rows.Count);
var cols = ds.Tables[0].Columns;
foreach (DataRow row in ds.Tables[0].Rows)
{
T m = new T();
foreach (var p in prop)
{
if (cols.Contains(p.Info.Name))
{
var val = row[p.Info.Name];
if (Convert.IsDBNull(val) == false)
{
p.Info.SetValue(m, val, null);//这里直接用反射的SetValue
}
}
}
list.Add(m);
}
return list;
}
反射代码
反射代码
这只是构造10000个只有5个属性的实体类而已
因为先运行的是动态编译IL的测试,所以缓存什么的都已经在这个时候建好了,下面反射只是调用缓存
如果这个测试还看不出太大区别的话,那就看下直接对比Set部分的性能
一般来说是6倍左右的性能差异
相关文章推荐
- 玩转动态编译 - 高级篇:三,实例属性的读取与设置
- Java创建文件和文件夹、文件属性的读取、文件属性的设置
- 设置java窗口的装饰属性实例复制即可运行
- Pyhton类、实例属性的获取和设置
- Android-NDK开发之基础--Android JNI实例代码(二)-- 获取/设置类的域或者说属性字段
- C#读取xml 文件 报错:未将对象引用设置到对象的实例
- C#反射技术的简单操作(读取和设置类的属性、属性值)
- Android-NDK开发之基础--Android JNI实例代码(二)-- 获取/设置类的域或者说属性字段
- javascript 操作cookies 存(设置)、读取、删除函数实例详解
- 由于 accessExternalSchema 属性设置的限制而不允许 'file' 访问, 因此无法读取方案文档 '***.xsd'
- Java设置与读取Cookie属性 央邦0首付,低押金先就业后付款
- javaScript 读取和设置文档元素的样式属性
- C#一般处理程序设置和读取session(session报错“未将对象引用设置到对象的实例”解决)
- jsp页面上读取和设置select标签下的选中项和radio属性的选中项
- jQuery元素属性操作实例(设置、获取及删除元素属性)
- __set($key,$values) 和__get($varName) 魔术方法设置读取私有属性
- C#反射技术之一读取和设置类的属性
- Yii——CDetailView,CGridView等widget中,输出Model属性或自定义,type设置实例
- C#反射实例——获取及设置对象属性,运行对象方法
- MicroDraw 控件读取AutoLisp设置的扩展属性