繁体   English   中英

C#反射-递归方法失去子属性

[英]C# Reflection - Recursive method losing child properties

刚刚开始尝试在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(一些反射字段或其他内容)。 我不知道如何在不删除递归的情况下解决这个问题。

当您为复杂类型字段集合调用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)));            
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM