通过反射设置对象的非值成员的值

时间:2012-03-23 15:55:18

标签: c#-4.0 reflection recursion

我正在尝试编写一种非常松散耦合的方法,将从数据库返回并存储在DataTable中的值映射到自定义对象的属性。这适用于所有值类型属性,但是我无法设置本身属于主类的对象的属性。以下是我到目前为止的情况:

    protected void AssignDataRowToFields(DataRow data, object currentClass = null)
    {
        string strPrefix = currentClass == null ? string.Empty : currentClass.GetType().Name;
        currentClass = currentClass ?? this;

        PropertyInfo[] properties = currentClass.GetType().GetProperties();

        foreach (PropertyInfo pi in properties)
        {
            if (pi.PropertyType.IsValueType || typeof(string).IsAssignableFrom(pi.PropertyType))
            {
                if (typeof(string).IsAssignableFrom(pi.PropertyType))
                    pi.SetValue(this, data[strPrefix + pi.Name].ToString(), null);
                else if (typeof(int).IsAssignableFrom(pi.PropertyType))
                    pi.SetValue(this, int.Parse(data[strPrefix + pi.Name].ToString()), null);
            }
            else
                this.AssignDataRowToFields(data, pi.GetValue(currentClass, null));
        }
    }

我递归调用AssignDataRowToFields的最后一个地方总是为null返回pi.GetValue(currentClass, null)。我也试过了pi.GetGetMethod().Invoke(currentClass, null),但也返回了null。任何帮助都将非常感谢,谢谢!

编辑:此处讨论的所有属性都是表单的自动属性:

public ComplexType theProperty { get; private set; }

1 个答案:

答案 0 :(得分:1)

确保您的类构造函数首先创建子对象。