从 protobuf 中的 FieldDescriptor 获取消息
Get message from FieldDescriptor in protobuf
在 protobuf (C#) 中,我想打印不同消息和子消息中的所有字段。如何获取消息类型并再次发送到函数(递归走到最低 child)?更具体:我必须做什么,那个 fieldDescriptor 像消息一样发送?我搜索解决方案,即更改“???”。
private void PrintAllReportableFieldsinMessage(Google.Protobuf.IMessage message)
{
foreach (var fieldDescriptor in message.Descriptor.Fields.InFieldNumberOrder())
{
if (fieldDescriptor.FieldType == Google.Protobuf.Reflection.FieldType.Message)
{
PrintAllReportableFieldsinMessage(???); // What can I send here?
}
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 + "|";
});
}
}
}
}
我找到了一个解决方案。 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 + "|";
});
}
}
}
}
在 protobuf (C#) 中,我想打印不同消息和子消息中的所有字段。如何获取消息类型并再次发送到函数(递归走到最低 child)?更具体:我必须做什么,那个 fieldDescriptor 像消息一样发送?我搜索解决方案,即更改“???”。
private void PrintAllReportableFieldsinMessage(Google.Protobuf.IMessage message)
{
foreach (var fieldDescriptor in message.Descriptor.Fields.InFieldNumberOrder())
{
if (fieldDescriptor.FieldType == Google.Protobuf.Reflection.FieldType.Message)
{
PrintAllReportableFieldsinMessage(???); // What can I send here?
}
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 + "|";
});
}
}
}
}
我找到了一个解决方案。 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 + "|";
});
}
}
}
}