Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为提高效率而使用property.setvalue()的替代方法_C#_Asp.net_Reflection - Fatal编程技术网

C# 为提高效率而使用property.setvalue()的替代方法

C# 为提高效率而使用property.setvalue()的替代方法,c#,asp.net,reflection,C#,Asp.net,Reflection,对于property.setvalue(),有哪些替代方法?我读过,它非常慢。我用它将IDataReader映射到POCO对象 这是代码的截断版本。这里的一切对我来说都很新鲜。我知道有很多框架可以完成这项任务。但是,我们不能使用它们 public class DbAutoMapper<T> { public IEnumerable<T> MapToList(IDataReader reader) { var list = new List&

对于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;
    }
}
公共类DbAutoMapper
{
公共IEnumerable映射列表(IDataReader阅读器)
{
var list=新列表();
while(reader.Read())
{                
var obj=Activator.CreateInstance();
foreach(obj.GetType().GetProperties()中的PropertyInfo属性)
{
foreach(prop.GetCustomAttributes中的var属性(true))
{                        
属性设置值(对象,值,空);
}
}
列表。添加(obj);
}
退货清单;
}
}

我想到了一些方法

跳过反射

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

        while (reader.Read())
        {                
            IInitFromReader obj = new T;

            obj.InitFromReader(reader);

            list.Add(obj);
        }
        return list;
    }
}
公共类DbAutoMapper,其中T:IInitFromReader,new()
{
公共IEnumerable映射列表(IDataReader阅读器)
{
var list=新列表();
while(reader.Read())
{                
IInitFromReader obj=新T;
对象InitFromReader(reader);
列表。添加(obj);
}
退货清单;
}
}
然后,您必须在每个entitiy对象中实现InitFromReader。显然,这忽略了反射的好处(代码更少)

代码生成

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

        while (reader.Read())
        {                
            IInitFromReader obj = new T;

            obj.InitFromReader(reader);

            list.Add(obj);
        }
        return list;
    }
}
为(InitFromReader)维护这段代码很痛苦,所以您可以选择生成它。这在许多方面为您提供了两全其美:

  • 您不必(手工)维护大量代码
  • 你不会受到反射的影响

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

秒:假设您打算通过名称、列到属性(这不是代码当前所做的)来映射,请考虑一个工具,如<>强>为您做< /强>,包括缓存的高性能反射发出。它还将为您处理命令本身。例如:

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

我不确定我是否理解这一点:“使用别人写的东西是不可取的。”也许他只接受建立在他解决方案基础上的答案?还有,GetCustomAttributes调用的意义是什么?您没有对属性执行任何操作…为什么不使用
DataTable
?这样会更有效率<代码>var dt=新数据表();dt.负载(读卡器)完成。我取出了一些代码。这适用于具有要映射到的db列名的属性。对于emit/code编织方法为+1。这就像代码生成——没有代码@RQDQ但好的一面是,“整洁”和“快速成员”都可以避免IL生成的血淋淋的细节损害开发者的理智:)@Gert某个该死的疯狂傻瓜为IL设计了一个“东西”-emit@MarcGravell有没有可能在PCL中加速相同的财产访问方式?@AlexanderLogger not AFAIK