Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C使用IEnumerator遍历嵌套属性_C#_Properties_Ienumerable_Ienumerator - Fatal编程技术网

C# C使用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

我在列表、数组或dict上看到了IEnumerator的示例和官方示例,但我有一个不同的问题。我有带属性的类,在这种情况下我如何实现IEnumerable和IEnumerator

我的属性类是:

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"
  }
}