将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
并自己构建它?
我假设你的object[]
包含值,例如,一个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();
例如: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