C# 将数组转换为类型数组
我正在从DB数据创建一个通用对象: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()实际
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()
表示什么?@marcGraveldata.TypesOf()
是一个Type[]
数组,它包含数据的类型。按顺序,在那。添加到问题。数据
始终是一个对象[]
-它与类型(T)
没有任何关系,因为它只是来自读取器的值。您试图用data.TypesOf()
表示什么?@marcGraveldata.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你是吗