4

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;
    }
}
4

2 に答える 2

5

まず、属性を使用しないのに、なぜ属性ごとにリフレクションを繰り返すのですか?

2番目:これを名前で列からプロパティにマップするつもりであると仮定すると(これはコードが現在行っていることではありません)、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;
}
于 2012-09-12T20:10:02.463 に答える
1

いくつかのアプローチが思い浮かびます...

反射をスキップ

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 を実装する必要があります。明らかに、これはリフレクションの利点をスキップします (コードが少なくなります)。

コード生成

(InitFromReader) のこのコードを維持するのは面倒なので、生成することを選択できます。これにより、多くの点で両方の長所が得られます。

  • 大量のコードを (手動で) 維持する必要はありません
  • リフレクションのパフォーマンス ヒットはありません。
于 2012-09-12T19:56:25.800 に答える