C# 将数组转换为类型数组

C# 将数组转换为类型数组,c#,arrays,types,C#,Arrays,Types,我正在从DB数据创建一个通用对象: object[] data = new object[dataReader.FieldCount]; dataReader.GetValues(data); T t = (T)Activator.CreateInstance(typeof(T), data); 但是,第三行没有构造函数错误的类型。如果,我想添加一个: if (typeof(T).GetConstructor(data.TypesOf()) != null) data.TypesOf()实际

我正在从DB数据创建一个通用对象:

object[] data = new object[dataReader.FieldCount];
dataReader.GetValues(data);
T t = (T)Activator.CreateInstance(typeof(T), data);
但是,第三行没有构造函数错误的类型。如果,我想添加一个

if (typeof(T).GetConstructor(data.TypesOf()) != null)
data.TypesOf()
实际上是一个数组-
Type[]
,它包含
数据中所有类型的对象

真正有效的
data.TypesOf()
的等价物是什么


或者我需要迭代
数据
并自己构建它吗?

据我所知,您正在尝试获取对象数组的元素类型。因此,您可以执行以下操作:

 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);

据我所知,您正在尝试获取对象数组的元素类型。因此,您可以执行以下操作:

 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);

我假设您的
对象[]
包含值,例如
int
string
float
,并且您正在尝试解析形式为
public T(int,string,float)
的构造函数。要获取类型,可以使用:

var types = Array.ConvertAll(data, x => x.GetType());
但这实际上对您没有多大帮助,因为这正是
Activator.CreateInstance(typeof(t),data)
已经尝试过的——如果
Activator
失败,我看不出你会做得更好,除非关键的区别是构造函数是非公共的,并且你会提供一些
BindingFlags

但就我个人而言,我认为用名字来约束比用职位来约束更容易;有这样的工具可以为您完成所有这些,让您可以简单地使用:

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

int userId = 12345;
var users = conn.Query<User>("select * from Users where Id = @userId",
      new {userId}).SingleOrDefault();
intuserid=12345;
var users=conn.Query(“从Id=@userId的用户中选择*”,
新的{userId}).SingleOrDefault();

我假设您的
对象[]
包含值,例如
int
string
float
,并且您正在尝试解析形式为
public T(int,string,float)
的构造函数。要获取类型,可以使用:

var types = Array.ConvertAll(data, x => x.GetType());
但这实际上对您没有多大帮助,因为这正是
Activator.CreateInstance(typeof(t),data)
已经尝试过的——如果
Activator
失败,我看不出你会做得更好,除非关键的区别是构造函数是非公共的,并且你会提供一些
BindingFlags

但就我个人而言,我认为用名字来约束比用职位来约束更容易;有这样的工具可以为您完成所有这些,让您可以简单地使用:

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

int userId = 12345;
var users = conn.Query<User>("select * from Users where Id = @userId",
      new {userId}).SingleOrDefault();
intuserid=12345;
var users=conn.Query(“从Id=@userId的用户中选择*”,
新的{userId}).SingleOrDefault();
查看方法时,对于
对象[]
参数:

在数量、顺序和类型上匹配的参数数组 要调用的构造函数的参数。如果args是空数组或 null,不接受任何参数的构造函数(默认值 构造函数)被调用

因此,可能在您的情况下,
数据
对象不是针对每个值键入的(如果从DB或文件获取)。您需要找到在
数据
数组中“键入”对象的方法。

查看方法时,对于
对象[]
参数:

在数量、顺序和类型上匹配的参数数组 要调用的构造函数的参数。如果args是空数组或 null,不接受任何参数的构造函数(默认值 构造函数)被调用


因此,可能在您的情况下,
数据
对象不是针对每个值键入的(如果从DB或文件获取)。您需要找到一种在
数据
数组中“键入”对象的方法。

只需使用
type.GetTypeArray(object[])


只需使用
Type.GetTypeArray(object[])


数据
始终是一个
对象[]
-它与
类型(T)
没有任何关系,因为它只是来自读取器的值。您试图用
data.TypesOf()
表示什么?@marcGravel
data.TypesOf()
是一个
Type[]
数组,它包含
数据的类型。按顺序,在那。添加到问题。
数据
始终是一个
对象[]
-它与
类型(T)
没有任何关系,因为它只是来自读取器的值。您试图用
data.TypesOf()
表示什么?@marcGravel
data.TypesOf()
是一个
Type[]
数组,它包含
数据的类型。按顺序,在那。增加了一个问题,对。我试图找出是否存在内置方法,而不是调用LINQ query.Right。我试图找出是否存在内置方法,而不是调用LINQ查询。@JNF你确定吗?特别是,
/
/
十进制
/
整数
/
之间的不匹配(我从我的micro-ORM工作中自信地说)是常见的。我强烈建议在大胆地说“不,类型是可以的”之前,先看看
Array.ConvertAll(data,x=>x.GetType())
所说的内容。如果类型正常,
Activator
将已经找到构造函数。@marcGravel-当然。我检查了我的数据。还没有遇到你描述的问题,所以这不是问题所在。将是,也许另一个时间。:)@在这种情况下,JNF:构造函数是非公共的吗?简单地说,它要么是数据不匹配,要么是非公共构造函数。@MarcGravel,更清楚地说,有时我会显式地将该函数用于没有构造函数的类型。说
int
@JNF然后。。。为什么你有寻找构造函数的代码?另外:dapper的
查询(sql,args)
可以处理这个问题fine@JNF你是吗