C# C使用IEnumerator遍历嵌套属性
我在列表、数组或dict上看到了IEnumerator的示例和官方示例,但我有一个不同的问题。我有带属性的类,在这种情况下我如何实现IEnumerable和IEnumerator 我的属性类是:C# C使用IEnumerator遍历嵌套属性,c#,properties,ienumerable,ienumerator,C#,Properties,Ienumerable,Ienumerator,我在列表、数组或dict上看到了IEnumerator的示例和官方示例,但我有一个不同的问题。我有带属性的类,在这种情况下我如何实现IEnumerable和IEnumerator 我的属性类是: public class standardMessage { public messageProperties message { get; set; } public messageFlag flag { get; set; } } public class messagePrope
public class standardMessage
{
public messageProperties message { get; set; }
public messageFlag flag { get; set; }
}
public class messageProperties
{
public string messageSubject { get; set; }
public string messageBody { get; set; }
}
public class messageFlag
{
public Boolean flagImportant { get; set; }
public Boolean flagPersonal { get; set; }
}
这是一个节目:
public class Program
{
static void Main(string[] args)
{
standardMessage myMessage = new standardMessage();
myMessage.message = new messageProperties
{
messageSubject = "Greetings",
messageBody = "Happy Weekend"
};
myMessage.flag = new messageFlag
{
flagImportant = false,
flagPersonal = true
};
//how do I iterate through all properties, without knowing how many are there, instead of writing this worm line of code?
Console.WriteLine(myMessage.message.messageSubject.ToString() + "\r\n" + myMessage.message.messageBody.ToString() + "\r\n" + myMessage.flag.flagImportant.ToString() + "\r\n" + myMessage.flag.flagPersonal.ToString());
Console.ReadLine();
}
}
如果您希望以生产级方式将对象打印为格式化字符串,则需要在所有类中重写ToString,以返回所需的任何格式 但是,如果您只想在屏幕上打印东西以进行调试或记录,为什么不使用JSON呢 公共静态字符串ToJsonobject@object=> System.Text.Json.Json序列化程序。Serialize@object,新的JsonSerializerOptions{WriteIndended=true}; Console.WriteLineToJSonymessage; 印刷品
{
"message": {
"messageSubject": "Greetings",
"messageBody": "Happy Weekend"
},
"flag": {
"flagImportant": false,
"flagPersonal": true
}
}
又快又脏,但又快又好用 我制作了一个非常原始的对象到json转换器。我不会在生产中使用它,它比Newtonsoft慢约30%,但它完成了工作
private static string PrintObject(object obj, int depth = 1)
{
var type = obj.GetType();
if (type.IsPrimitive || type == typeof(Decimal) || type == typeof(String))
return "\"" + obj.ToString() + "\"";
var props = type.GetProperties();
string ret = "";
for (var i = 0; i < props.Length; i++)
{
var val = props[i].GetValue(obj);
ret += new string('\t', depth) + "\"" + props[i].Name + "\":" + PrintObject(val, depth + 1);
if (i != props.Length - 1)
ret += "," + Environment.NewLine;
}
return ("{" + Environment.NewLine + ret + Environment.NewLine + new string('\t', depth - 1) + "}").Replace("\t", " ");
}
在这种情况下,您可能只想重写类的ToString方法。好吧,您已经有了类似的问题,使用反射可以得到所有类属性的IEnumerable。然后,您可以像遍历任何其他树结构一样,遍历属性以获得嵌套在其中的任何属性。@Pavel Anikhouski感谢您指出其他解决方案;然而,它没有实现IEnumerable,尽管属性是单例的,但我一直在寻找列表解决方案,但更重要的是,当我实现时,我发现它没有返回子属性。例如,对于我们这里的问题,我希望不仅看到消息和标志,还看到消息中的messageSubject和messageBody,以及standardMessage标志中的flagImportant和flagPersonal。非常感谢,我可以问一下,我发现System.Text.Json有一个错误,因为System.Text中不存在Json-您的建议?@Nick System.Text.Json来自.NET Core 3.0,如果您使用的是Framework或旧版本的Core,请获取“谢谢”,它按照您的建议工作。我只是想知道,如果在另一个环境中安装Nuget时没有Json问题,我是否可以做到这一点,你的答案绝对没有问题。@Nick你可以自己编写一个序列化程序,但这很麻烦。在那一点上,你最好还是重写ToString自己。非常感谢,我把它放在Main中,没有私有静态,并且按照你描述的那样工作。我可以问一件事吗?我通常不知道深度,如何修改以搜索到嵌套属性的最后一级?非常感谢你!!不要为深度参数添加任何内容。当您调用它时,它将从1开始,并在每次调用时递归递增。如果要打印嵌套对象,只需调用PrintObjectmyMessage.flag;如果这解决了您的问题,您是否可以将其标记为已回答?非常感谢。
{
"message":{
"messageSubject":"Greetings",
"messageBody":"Happy Weekend"
},
"flag":{
"flagImportant":"False",
"flagPersonal":"True"
}
}