gpt4 book ai didi

c# - 出于效率目的使用 property.setvalue() 的替代方法

转载 作者:太空狗 更新时间:2023-10-30 00:54:34 27 4
gpt4 key购买 nike

property.setvalue() 有哪些替代方案?我读过它很慢。我正在使用它将 IDataReader 映射到 POCO 对象。

这是代码的截断版本。这里的一切对我来说都是全新的。我知道有很多框架可以完成这项任务。但是,我们不能使用它们。

public class DbAutoMapper<T>
{
public IEnumerable<T> MapToList(IDataReader reader)
{
var list = new List<T>();

while (reader.Read())
{
var obj = Activator.CreateInstance<T>();

foreach (PropertyInfo prop in obj.GetType().GetProperties())
{
foreach (var attribute in prop.GetCustomAttributes(true))
{
prop.SetValue(obj, value, null);
}
}

list.Add(obj);
}
return list;
}
}

最佳答案

首先:当您不使用属性时,为什么要为每个属性重复反射?

第二:假设您打算通过名称、列到属性(这不是代码当前所做的)来映射它,请考虑像 dapper 这样的工具,它为您做这一切,包括缓存的高性能反射发射。它还会为您处理命令本身。例如:

string region = "North";
var customers = conn.Query<Customer>(
@"select * from Customers where Region = @region",
new { region } // full parameterization, the easy way
).ToList();

如果您需要更多控制,请考虑 FastMember ,它提供快速的成员访问(同样,反射发射),但不特定于数据访问:

var accessor = TypeAccessor.Create(typeof(T)); 
string propName = // something known only at runtime
while( /* some loop of data */ ) {
var obj = new T();
foreach(var col in cols) {
string propName = // ...
object cellValue = // ...
accessor[obj, propName] = cellValue;
}
yield return obj;
}

关于c# - 出于效率目的使用 property.setvalue() 的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12395204/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com