如何使用属性的名称编写填充属性的方法?

时间:2016-12-29 15:59:55

标签: c# reflection

这是我正在做的事情。假设我有一个具有许多属性的类。我正在尝试编写一个看起来像这样的方法

       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"))}

传递的要求是我们不应该将包程序存储为字符串。

1 个答案:

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

所有这些都假设你的列名和属性名是相同的,因为你似乎已经指定了它们。