我正在从数据库数据创建一个通用对象:
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
。
不过,就我个人而言,我建议按名称 绑定(bind)比按位置绑定(bind)更容易;有像 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();
关于c# - 将数组转换为类型数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16414504/