您的位置:首页 > 其它

实例属性的读取与设置

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倍左右的性能差异
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐