1

AutoMapperやValueInjecterなどのサードパーティライブラリを使用せずに、一部のIDataReaderをオブジェクトにマップする簡単な方法はありますか?

4

2 に答える 2

1

もちろん、

class MyObject
{
    public string SomeProperty { get; set; }
    public MyObject(IDataReader reader)
    {
        SomeProperty = reader.GetString(0);
        // - or -
        SomeProperty = reader.GetString(reader.GetOrdinal("SomeProperty"));
        // etc.
    }
}
于 2011-02-23T16:08:06.173 に答える
1

クイックの意味はわかりませんが、リフレクションを使用して何かをまとめることができます。オブジェクトのすべての値がプロパティを介して設定されるなど、多くの仮定を行う必要があります。また、DataReader列はオブジェクトプロパティ名と一致する必要があります。しかし、あなたはこのようなことをすることができます:

注:このSetProperty関数は、DevXに関する記事からのものです。(これはVB.NETにあり、C#に変換しました。間違いがある場合は、おそらく何かを見逃していました。)

IList<MyObject> myObjList = new List<MyObject>();

while (reader.Read()){
  int fieldCount = reader.FieldCount;
  MyObject myObj = new MyObject();
  for(int i=0;i<fieldCount;i++){
    SetProperty(myObj, reader.GetName(i), reader.GetOrdinal(i));
  }
  myObjList.Add(myObj);
}

bool SetProperty(object obj, String propertyName, object val) {
    try {
        //get a reference to the PropertyInfo, exit if no property with that 
        //name
        System.Reflection.PropertyInfo pi = obj.GetType().GetProperty(propertyName);
        if (pi == null) then return false;
        //convert the value to the expected type
        val = Convert.ChangeType(val, pi.PropertyType);
        //attempt the assignment
        pi.SetValue(obj, val, null);
        return true;
    }
    catch {
        return false;
    }
}

このコードが実行される保証はありません(私はそれを入力しているだけで、コンパイル/テストはしていません)が、少なくともそれは始まりかもしれません。

私は過去にこのようなことを行っており、プロパティにマップするデータリーダー列を示す属性をプロパティに適用することに夢中になっています。ここに含めるには多すぎますが、これは単なる初心者であり、うまくいけばあなたが探しているものです。

お役に立てれば!

于 2011-02-23T16:21:17.873 に答える