9

私はValueInjecterを理解しようとしていたので、自家製の小さなORMで使用できます。DataRowとDataTableのマッピングをサポートする必要があるため、このタイプのマッパーを実装しようとしています。そして正直なところ、ドキュメントは十分ではなく、私はそれを試してみたかったのです。たぶん、Omuまたはこのライブラリの他のユーザーが答えるでしょう。

これが私のDataRowインジェクターです

public class DataRowInjection: KnownSourceValueInjection<DataRow>
    {
        protected override void Inject(DataRow source, object target)
        {
            for (var i = 0; i < source.ItemArray.Count(); i++)
            {

                //TODO: Read from attributes or target type
                var activeTarget = target.GetProps().GetByName(source.Table.Columns[i].ToString(), true);
                if (activeTarget == null) continue;

                var value = source.ItemArray[i];
                if (value == DBNull.Value) continue;

                activeTarget.SetValue(target, value);
            }
        }
    }

これはかなりうまくいきます。これが、DataTableにこれを実装して、IenumarableまたはIListを返す方法についての質問です。私が期待するコードスニペットはのようなものです。

public class DataTableInjector  : ?????
    {
        protected override void Inject(DataTable source, IList<T> target)   where T : class
        {

          // Do My Staff
            foreach (var row in source.Rows)
            {
                target[i].InjectFrom<DataRowInjection>(row);
            }

            //return IList?
        }
    }

どうすればこれを達成できますか。ありがとうございました

~~~~~~ここに私がOmuの助けを借りて書いた完全なコードがあります

 public class DataTableInjection<T> : ValueInjection where T  : new()
    {
        protected override void Inject(object source, object target)
        {
            var dt = source as DataTable;
            var t = target as IList<T>;

            foreach (DataRow dr in dt.Rows)
            {
                var t2 = new T();
                t2.InjectFrom<DataRowInjection>(dr);
                t.Add(t2);
            }
        }
    }
4

1 に答える 1

6

と同じようにDataRow、今すぐ使用しKnownSourceValueInjection<DataTable>ます。

また、ご覧のとおり、このInjectメソッドはvoid何も返さないため、ターゲットオブジェクト(既に存在する)を変更するだけです。

InjectFromこれは新しいオブジェクトを作成するのではなく、既存のオブジェクトに値を挿入することを忘れないでください。

だからあなたは持っているつもりです:

var list = new List<T>();
list.InjectFrom<MyFromDataTableInj>(dataTable)

実際、あなたの場合、このインジェクションはDataTableからのみ使用するIList<T> ので、次のように実行できます。

   public class My<T> : ValueInjection
   {
        protected override void Inject(object source, object target)
        {
            var dt = source as DataTable;
            var t = target as IList<T>;
... 
        }
    }

そして使用法:

list.InjectFrom<My<Foo>>(datatable):
于 2011-03-29T12:30:49.197 に答える