1

DB データからジェネリック オブジェクトを作成しています。

object[] data = new object[dataReader.FieldCount];
dataReader.GetValues(data);
T t = (T)Activator.CreateInstance(typeof(T), data);

ただし、3行目にコンストラクタエラーのない型。追加したいif

if (typeof(T).GetConstructor(data.TypesOf()) != null)

data.TypesOf()は、実際には配列です。Type[]これには、 内のすべてのタイプのオブジェクトが含まれていますdata

data.TypesOf()実際に機能するのと同等のものは何ですか?

dataそれとも、自分で繰り返して構築する必要がありますか?

4

4 に答える 4

6

object[]たとえば、 an int、 a 、 astringなどの値が含まれてfloatおり、フォームのコンストラクターを解決しようとしていると想定していますpublic T(int,string,float)。タイプを取得するには、次を使用できます。

var types = Array.ConvertAll(data, x => x.GetType());

しかし、それは実際にはここではあまり役に立ちません。なぜなら、それはすでにやろうとしてActivator.CreateInstance(typeof(T), data)いることがほとんどだからです- だから失敗した場合、あなたがもっとうまくやろうとしていることは明らかではありません - 鍵が違いは、コンストラクターが非パブリックであり、いくつかを提供することです。ActivatorBindingFlags

ただし、個人的には、位置よりも名前でバインドする方が簡単だと思います。そのすべてを行うdapperのようなツールがあり、簡単に使用できます。

var data = conn.Query<SomeType>(sql, args).ToList();

例えば:

int userId = 12345;
var users = conn.Query<User>("select * from Users where Id = @userId",
      new {userId}).SingleOrDefault();
于 2013-05-07T08:34:07.893 に答える
1

私が理解している限り、オブジェクト配列の要素の型を取得しようとしています。したがって、次のようなことができます:

 var ctorArgsTypes = data.Select(d => d.GetType()).ToArray()

 var ctor = typeof(T).GetConstructor(ctorArgsType);

 // check if appropriate ctor exists
 if (ctor == null)
     throw something

 T t = (T)Activator.CreateInstance(typeof(T), data);
于 2013-05-07T08:33:43.243 に答える