这是我正在做的事情。假设我有一个具有许多属性的类。我正在尝试编写一个看起来像这样的方法
public static void GetNullableInt32(this DbDataReader reader, Type property)
{
property = reader.IsDBNull(reader.GetOrdinal(property.name))
? (int?)null
: reader.GetInt32(reader.GetOrdinal(property.name));
}
从反射中提取属性名称,并在方法中设置属性。我输入了参数作为占位符,无论它需要什么类型。然后我会称之为
reader.GetNullableInt32(Class.Property1);
从数据库读取器设置类的所有属性。
有一种简单的方法吗?或者是否有一个更好的结构,而不是必须输入列名称作为字符串从列名称拉出?
修改
在回复删除的评论,询问我们为什么不传递字符串名称时,代码看起来像
Class item = new Class {
ContactRelationId = reader.IsDBNull(reader.GetOrdinal("ContactRelationId"))
? (int?)null
: reader.GetInt32(reader.GetOrdinal("ContactRelationId"))}
传递的要求是我们不应该将包程序存储为字符串。
答案 0 :(得分:1)
您需要通过具有该属性的对象的实例发送,即将在其上设置该属性。如果你的班级看起来像:
public class MyClass
{
public int? MyInt { get; set; }
}
你必须向这个方法发送一个实例:
public static void GetNullableInt32(this DbDataReader reader, MyClass instance, string propName)
但是为什么在不需要的时候使用反射呢?它的速度较慢,通常会导致错误。只需在调用方法中执行赋值:
public static void GetNullableInt32(this DbDataReader reader, string propName)
{
//...
}
//calling method
myClassInstance.MyInt = reader.GetNullableInt32(nameof(MyClass.MyInt));
所有这些都假设你的列名和属性名是相同的,因为你似乎已经指定了它们。