[英]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.