0

これが私の問題です:

私は機能を持っています

public static void fillObject(object [] obs, DataTable dt)
{
    for (int j = 0; j < dt.Rows.Count; j++)
    {
        DataRow dr = dt.Rows[j];
        fillObject(obs[j], dr);
    }
}

obsは、あるタイプのクラスの配列です(たとえば、「羊」の例を参照してください)。デバッグobs[j]するnullと、オブジェクトタイプではなく、次のsheepようなことを行う必要があります。

obs[j] = new sheep();

何か案は?

4

2 に答える 2

5

ソリューションを強く入力したい場合は、ジェネリックを使用できます

public static void FillObject<T>(T [] obs, DataTable dt) where T: new
{
    //...

    obs[j] = new T();
}

次に、次のような関数を呼び出します

FillObject<Sheep>(mySheep, dt);
于 2012-07-17T17:49:34.180 に答える
0

言いたいことを正確に伝えるのは難しいです。特定のシナリオに応じて、次のいずれかを実行できます。

メソッドに構築関数を渡すことができます。

public static void fillObject(object [] obs, DataTable dt, Func<object> builder)
{
   for (int j = 0; j < dt.Rows.Count; j++)
   {
      DataRow dr = dt.Rows[j];

      if (obs[j] == null)
         obs[j] = builder();

      fillObject(obs[j], dr);
   }
}

または、タイプがわかっている場合は、構築関数の辞書を使用できます。

Dictionary<Type, Func<object>> sBuilders = new Dictionary<Type, Func<object>>
{
   { typeof(Type1), () => new Type1() },
   { typeof(Type2), () => new Type2() },
   // etc...
};

public static void fillObject(object [] obs, DataTable dt, Type pType)
{
   for (int j = 0; j < dt.Rows.Count; j++)
   {
      DataRow dr = dt.Rows[j];

      if (obs[j] == null)
         obs[j] = sBuilders[pType]();

      fillObject(obs[j], dr);
   }
}
于 2012-07-17T17:53:24.740 に答える