Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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# 从protobuf中的FieldDescriptor获取消息_C#_.net_Protocol Buffers - Fatal编程技术网

C# 从protobuf中的FieldDescriptor获取消息

C# 从protobuf中的FieldDescriptor获取消息,c#,.net,protocol-buffers,C#,.net,Protocol Buffers,在protobuf(C#)中,我想打印不同消息和子消息中的所有字段。如何获取消息类型并再次发送到函数(递归遍历到最低的子级)?更具体地说:我必须做的是,fieldDescriptor像消息一样发送?我搜索解决方案,即“更改” 我发现一个孤独的地方。如果未设置子消息内的任何值,则HasValue return false。然后我必须创建一个具有所有默认值的新Imessage。因此,这段代码用于打印所有消息和子消息中的所有字段名 private void PrintAllReportableFiel

在protobuf(C#)中,我想打印不同消息和子消息中的所有字段。如何获取消息类型并再次发送到函数(递归遍历到最低的子级)?更具体地说:我必须做的是,fieldDescriptor像消息一样发送?我搜索解决方案,即“更改”


我发现一个孤独的地方。如果未设置子消息内的任何值,则HasValue return false。然后我必须创建一个具有所有默认值的新Imessage。因此,这段代码用于打印所有消息和子消息中的所有字段名

private void PrintAllReportableFieldsinMessage(Google.Protobuf.IMessage message)
{
    foreach (var fieldDescriptor in message.Descriptor.Fields.InFieldNumberOrder())
    {
        if (fieldDescriptor.FieldType == Google.Protobuf.Reflection.FieldType.Message)
        {
            if (fieldDescriptor.Accessor.HasValue(message))
            {
                IMessage submessage = fieldDescriptor.Accessor.GetValue(message) as IMessage;
                PrintAllReportableFieldsinMessage(submessage);
            }
            else {
                IMessage cleanSubmessage = fieldDescriptor.MessageType.Parser.ParseFrom(ByteString.Empty);
                PrintAllReportableFieldsinMessage(cleanSubmessage);
            }
        }
        else
        {
            Google.Protobuf.Reflection.FieldOptions options = fieldDescriptor.GetOptions();
            if (options != null && options.GetExtension(HelloworldExtensions.Reportable))
            {
                var fieldValue = fieldDescriptor.Accessor.GetValue(message);
                var fieldName = fieldDescriptor.Name;
                Dispatcher.Invoke(() =>
                {
                    lReadableResult.Content += fieldName + ":" + fieldValue + "|";
                });
            }
        }
    }
}
private void PrintAllReportableFieldsinMessage(Google.Protobuf.IMessage message)
{
    foreach (var fieldDescriptor in message.Descriptor.Fields.InFieldNumberOrder())
    {
        if (fieldDescriptor.FieldType == Google.Protobuf.Reflection.FieldType.Message)
        {
            if (fieldDescriptor.Accessor.HasValue(message))
            {
                IMessage submessage = fieldDescriptor.Accessor.GetValue(message) as IMessage;
                PrintAllReportableFieldsinMessage(submessage);
            }
            else {
                IMessage cleanSubmessage = fieldDescriptor.MessageType.Parser.ParseFrom(ByteString.Empty);
                PrintAllReportableFieldsinMessage(cleanSubmessage);
            }
        }
        else
        {
            Google.Protobuf.Reflection.FieldOptions options = fieldDescriptor.GetOptions();
            if (options != null && options.GetExtension(HelloworldExtensions.Reportable))
            {
                var fieldValue = fieldDescriptor.Accessor.GetValue(message);
                var fieldName = fieldDescriptor.Name;
                Dispatcher.Invoke(() =>
                {
                    lReadableResult.Content += fieldName + ":" + fieldValue + "|";
                });
            }
        }
    }
}