刚开始尝试在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(某些反射域或其他东西)。我不知道如何在不删除递归的情况下解决这个问题。
答案 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)));
}