C#Reflection - 递归方法丢失子属性

时间:2014-11-20 11:05:41

标签: c# reflection

刚开始尝试在C#中进行一些反思。它很新,我刚刚开始一个简单的递归实验。我有两个班:

public class Parent{

public ChildClass child = new ChildClass();
public string Name = "name";
private string Id = "id";

}

public class ChildClass{

public string ChildName = "someName";
private string ChildID = "someId";

}

我有两个,都包含两个我希望能够编辑的字符串。

现在我有了这个方法:

private void EditStringsOfObject(object myObj){

    var fields = myObj.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public |
                                           BindingFlags.NonPublic | BindingFlags.DeclaredOnly);

    fields.Where(x => x.FieldType == typeof(string) && x.Getvalue(myObj) != null).ToList
    .ForEach(y => y.SetValue(myObj, SomeMethodManipulatingStrings(y.GetValue(myObj).ToString())));

我要在这里跳一下,然后说我已经证实这是按照惯例工作的。 (下面是EditStringsOfObject的延续)

    var children = fields.Where(x => !x.FieldType.IsPrimitive &&
        !x.FieldType.Namespace.Contains("System") && !x.FieldType.IsArray).ToList
    .ForEach(EditStringsOfObject);
}

可能有点乱,我为此道歉。 现在,当Parent是EditStringsOfObject的参数时,它可以正常工作,但是当它到达底部并递归调用带有Parent.child的EditStringsOfObjects时,我将丢失属性ChildName和ChildID。我剩下的字段只有一些IntPtr和m_name(某些反射域或其他东西)。我不知道如何在不删除递归的情况下解决这个问题。

1 个答案:

答案 0 :(得分:1)

当您为复杂类型的字段集合调用EditStringsOfObject时,您已经忘记了GetValue方法

    private static void EditStringsOfObject(object myObj)
    {

        var fields = myObj.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public |
                                               BindingFlags.NonPublic | BindingFlags.DeclaredOnly);

        fields.Where(x => x.FieldType == typeof(string) && x.GetValue(myObj) != null)
            .ToList()
            .ForEach(y => y.SetValue(myObj, SomeMethodManipulatingStrings(y.GetValue(myObj).ToString())));

        fields.Where(x => !x.FieldType.IsPrimitive && !x.FieldType.Namespace.Contains("System") && !x.FieldType.IsArray)
            .ToList()
            .ForEach(x => EditStringsOfObject(x.GetValue(myObj)));            
    }