2016-12-29 72 views
0

这是我正在看的。假设我有一个具有多个属性的类。我试图写一个看起来像这样如何编写使用属性名称填充属性的方法?

 public static void GetNullableInt32(this DbDataReader reader, Type property) 
     { 
      property = reader.IsDBNull(reader.GetOrdinal(property.name)) 
         ? (int?)null 
         : reader.GetInt32(reader.GetOrdinal(property.name)); 

     } 

凡属性名称都是从反射拉的方法,并且属性是在方法中设置。我把Type中的参数作为占位符来放入它需要的任何类型。然后我会这样称呼它:

 reader.GetNullableInt32(Class.Property1); 

从数据库读取器设置类的所有属性。

有没有简单的方法来做到这一点?或者是否有更好的结构,而不必将字段名称作为字符串输入,而是从列名称中提取?

编辑

在回答删除评论问,为什么我们不只是传递的字符串名称,使用的代码看起来像

  Class item = new Class { 
       ContactRelationId = reader.IsDBNull(reader.GetOrdinal("ContactRelationId")) 
        ? (int?)null 
        : reader.GetInt32(reader.GetOrdinal("ContactRelationId"))} 

而流传下来的是要求我们不应该将包过程存储为字符串。

回答

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

这一切都假定你的列名和属性名相同,你似乎已经指定他们。

相关问题