如何递归循环反射类型并设置它的子对象值?

时间:2013-02-13 09:30:32

标签: c# reflection recursion

对于我的数据层,我有一个L2Sql程序集,其中包含我的所有实体。这些实体大多是相互关联的。问题在于,由于我们的内部开发标准,我们希望在创建对象实例后将某些属性设置为特定值。

我的想法是递归扫描我的相关对象(Person.ContactDetails.Address),设置属性值,然后返回父对象(Person)以进行进一步处理。

我已经进行了递归,但遗憾的是它似乎只返回了heirachy(Address)中的最后一个孩子而不是Person。

这是我的代码:

private Type SetDefaultTypeValues(Type t, object o, Type parentType)
{
    Type theType = t;
    PropertyInfo[] fields = theType.GetProperties();

    foreach (PropertyInfo fi in fields)
    {
        switch (fi.Name)
        {
            case "CreateDate":
                fi.SetValue(o, DateTime.Now, null);
                break;
            case "ModifyDate":
                fi.SetValue(o, DateTime.Now, null);
                break;
            case "Active":
                fi.SetValue(o, true, null);
                break;
            default:
                if (fi.PropertyType == typeof(DateTime))
                {
                    fi.SetValue(o, new DateTime(1900, 01, 01, 12, 0, 0), null);
                }
                break;
        }

        if (fi.PropertyType.FullName.StartsWith("whatever.arme.Domain.Entities") && fi.PropertyType != parentType) // This is to ignore properties of the child which contain Parent references
        {
            var obj = fi.GetValue(o, null);
            if (obj == null)
                obj = Assembly.GetAssembly(theType).CreateInstance(fi.PropertyType.FullName);
            theType = SetDefaultTypeValues(fi.PropertyType, obj, theType); // I imagine the problem lies between here...
        }
    }
    return theType; // ... and here?
}

为什么我的父对象没有返回到原始调用者,而是返回不同类型的对象?

1 个答案:

答案 0 :(得分:0)

您应该返回t而不是theType,因为当您为某个媒体资源调用时,您会使用theType的返回值覆盖SetDefaultTypeValues