我正在从DB数据创建一个通用对象:
object[] data = new object[dataReader.FieldCount];
dataReader.GetValues(data);
T t = (T)Activator.CreateInstance(typeof(T), data);
Run Code Online (Sandbox Code Playgroud)
但是,第三行没有构造函数错误的类型.我想添加一个if:
if (typeof(T).GetConstructor(data.TypesOf()) != null)
Run Code Online (Sandbox Code Playgroud)
data.TypesOf()实际上是一个数组 - Type[]包含所有类型的对象data.
什么是data.TypesOf()真正有效的?
或者我是否需要自己迭代data并构建它?
我假设您object[]的值包含例如a int,a string和a float,并且您正在尝试解析表单的构造函数public T(int,string,float).要获取类型,您可以使用:
var types = Array.ConvertAll(data, x => x.GetType());
Run Code Online (Sandbox Code Playgroud)
但是,实际上并不会帮助你在这里多,因为这是非常,很多东西Activator.CreateInstance(typeof(T), data)已经尝试过这样做 -所以,如果Activator失败了,我没有看到,很明显,你会更好地做任何-除非关键区别在于构造函数是非公开的,您将提供一些BindingFlags.
但就个人而言,我建议按姓名绑定比按位置绑定更容易; 有像dapper这样的工具可以为你做所有这些,让你简单地使用:
var data = conn.Query<SomeType>(sql, args).ToList();
Run Code Online (Sandbox Code Playgroud)
例如:
int userId = 12345;
var users = conn.Query<User>("select * from Users where Id = @userId",
new {userId}).SingleOrDefault();
Run Code Online (Sandbox Code Playgroud)