反射设置类的值

时间:2017-06-07 19:48:51

标签: c# reflection

我正在尝试构建一个扩展来使用SQLDataReader中的值填充对象。

到目前为止我的代码是

public static T RetunObject<T>(this Type source, SqlDataReader dr)
    {
        Type type = source.GetType();
        PropertyInfo[] properties = type.GetProperties();
        foreach (PropertyInfo property in properties)
        {
            property.SetValue(property, dr[property.Name]);
            type.GetProperty(property.Name).SetValue(type, dr[property.Name]);
        }

        return type.Cast<T>();
    }

有一点可以肯定的是,最后一行不正确,并且不确定此时是否有办法实现此目的。

目标结果是使用像

这样的代码
MyClass myclass = new MyClass();
var results = myclass.ReturnObject(myDataReader);

反思从来都不是我的强项。所以我很确定我相当遥远。

出现的更新代码

    public static object RetunObject(this object source, SqlDataReader dr)
    {
        while (dr.Read())
        {
            foreach (PropertyInfo property in source.GetType().GetRuntimeProperties())
            {
                if(dr.GetSchemaTable().Select("ColumnName='"+ property.Name+"'").Count() == 1)
                {
                    var readervalue = dr.GetValue(dr.GetOrdinal(property.Name));
                    property.SetValue(source, readervalue);
                }
            }
        }
        return source;
    }

一样使用
     return (Role)role.RetunObject(sqlcomm.ExecuteReader());

使用SQLDataReader并返回一个通用对象,该对象可以转换为您需要的对象类型。显然,如果你试图转换为无效类型的对象,那么它不会起作用,但到目前为止这似乎有效。我的下一个试验将是测试嵌套类,看它是否也能在那里工作。

1 个答案:

答案 0 :(得分:1)

在你的例子中有很多错误,你完全不清楚你想要完成什么。可能你试图将阅读器的属性应用到你的对象:

public static T RetunObject<T>(this T source, SqlDataReader dr)
{
    var type = typeof(T);
    var properties = type.GetProperties();
    foreach (var property in properties)
    {
        property.SetValue(source, dr[property.Name]);
    }
    return source;
}

但是,我建议您使用Entity Framework,因为您可能通过这样做来创建另一个自行车。与您尝试完成的解决方案相比,此任务完成得更好/更快/更安全。

在尝试实施某些内容之前,尽量花一些时间在人们常用的东西上,这是你身边没有人会理解/支持的。

与花时间在潜在的错误代码上相比,它会更有用,更快捷。以下是EF Code First的良好开端:https://msdn.microsoft.com/en-us/library/jj193542(v=vs.113).aspx