将Array转换为Array类型

本文关键字:Array 类型 转换 | 更新日期: 2023-09-27 18:12:29

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

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

但是,第三行没有构造函数错误的类型。我想添加一个if:

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

data.TypesOf()实际上是一个数组——Type[]——它包含了data中所有类型的对象。

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

或者我需要迭代data并自己构建它?

将Array转换为Array类型

我假设你的object[]包含值,例如,一个int,一个string和一个float,你正试图解决形式public T(int,string,float)的构造函数。要获取类型,可以使用:

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

但这实际上并没有多大帮助,因为这几乎就是Activator.CreateInstance(typeof(T), data) 已经尝试做的 -所以如果Activator失败了,我不认为你会做得更好-除非关键的区别是构造函数是非公共的,你要提供一些BindingFlags

但是,我个人认为,通过name绑定比通过位置绑定更容易;有像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();

据我所知,您正在尝试获取对象数组元素的类型。所以你可以这样做:

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

当您查看Activator时。创建实例(Type, Object[])方法,用于Object[]参数:

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

所以也许在您的情况下,您的data对象不是为每个值键入的(如果从DB或文件获取)。您需要找到一种方法来"键入"您的对象在您的data数组。

就用Type.GetTypeArray(object[])吧。

https://msdn.microsoft.com/en-us/library/system.type.gettypearray (v = vs.110) . aspx