我正在使用Apache.Avro包从一些Avro模式生成一些C#.我有共享公共构建块(如Enum定义)的不同架构.

我遇到了对公共共享模式的引用不能正确解析的问题.

以下是在一个文件中定义的模型:

{
    "name": "MyModel",
    "namespace": "My.Model",
    "type": "record",
    "fields": [
        {
            "name": "Planet",
            "type": "My.Model.PlanetEnum",
        }
    ]
}

以下是My.Model.PlanetEnum的定义,它将在多个车型之间共享:


{
  "name": "PlanetEnum",
  "namespace": "My.Model",
  "type": "enum",
  "symbols": [
    "Earth",
    "Mars"
  ]
}

下面是我用来生成模式的C#:

        var codeCompileUnit = new CodeGen
        {
            Schemas =
            {
/* generation fails even if I include the enum definition inline here
                Schema.Parse("""
{
  "name": "PlanetEnum",
  "namespace": "My.Model",
  "type": "enum",
  "symbols": [
    "Earth",
    "Mars"
  ]
}
"""),
*/
                Schema.Parse(schemaText)
            },
        }.GenerateCode();

        var stringWriter = new StringWriter(new StringBuilder());
        var provider = CodeDomProvider.CreateProvider("csharp");
        provider.GenerateCodeFromCompileUnit(codeCompileUnit, stringWriter, new CodeGeneratorOptions());
        var schemaCode = stringWriter.ToString();
        return schemaCode;

我得到的错误是:

Avro.SchemaParseException: Undefined name: My.Model.PlanetEnum at 'fields[0].type'
   at Avro.Schema.ParseJson(JToken jtok, SchemaNames names, String encspace)
   at Avro.RecordSchema.createField(JToken jfield, Int32 pos, SchemaNames names, String encspace)
   at Avro.RecordSchema.NewInstance(Type type, JToken jtok, PropertyMap props, SchemaNames names, String encspace)
   at Avro.NamedSchema.NewInstance(JObject jo, PropertyMap props, SchemaNames names, String encspace)
   at Avro.Schema.ParseJson(JToken jtok, SchemaNames names, String encspace)
   at Avro.Schema.Parse(String json, SchemaNames names, String encspace)
   at Avro.Schema.Parse(String json)

推荐答案

我设法通过将两个模式组合在一起来生成C#代码,如下所示:

    var combinedSchemaText = $"[{planetEnumSchemaText},{schemaText}]";
    var combinedSchema = Schema.Parse(combinedSchemaText);

我使用的完整代码如下:


        public static void Main()
        {
            var schemaText = @"
            {
                ""name"": ""MyModel"",
                ""namespace"": ""My.Model"",
                ""type"": ""record"",
                ""fields"": [
                    {
                        ""name"": ""Planet"",
                        ""type"": ""My.Model.PlanetEnum""
                    }
                ]
            }";

            var code = GenerateCSharpCodeCombined(schemaText);
            Console.WriteLine("Generated C# code:");
            Console.WriteLine(code);
        }

        private static string GenerateCSharpCodeCombined(string schemaText)
        {
            var planetEnumSchemaText = @"
            {
                ""name"": ""PlanetEnum"",
                ""namespace"": ""My.Model"",
                ""type"": ""enum"",
                ""symbols"": [
                ""Earth"",
                ""Mars""
                ]
            }";

            var combinedSchemaText = $"[{planetEnumSchemaText},{schemaText}]";
            var combinedSchema = Schema.Parse(combinedSchemaText);

            var codeGen = new CodeGen();
            codeGen.Schemas.Add(combinedSchema);

            var codeCompileUnit = codeGen.GenerateCode();

            var stringWriter = new StringWriter(new StringBuilder());
            var provider = CodeDomProvider.CreateProvider("csharp");
            provider.GenerateCodeFromCompileUnit(codeCompileUnit, stringWriter, new CodeGeneratorOptions());
            var schemaCode = stringWriter.ToString();

            return schemaCode;
        }

判断一下,让我们看看这是否解决了您的问题.

Csharp相关问答推荐

Should. ThrowAsynock未捕获来自httpClient. GetAsynock()请求的异常

Blazor:计算值或保留为默认值

C#将参数传递给具有变化引用的变量

总是丢弃返回的任务和使方法puc无效之间有区别吗?

我需要两个属性类吗

选取器与.NET Maui MVVM的绑定属性

附加标题不起作用,而添加则起作用

如何将MongoDB序列化程序设置为内部对象属性

用C#从Word文档中删除重复的节控件和文本内容控件

具有以接口为其类型的属性的接口;类指定接口的实现,但无效

ASP.NET Core MVC将值从视图传递到控制器时出现问题

在使用StringBuilder时,如何根据 colored颜色 设置为richTextBox中的特定行着色?

C#多键字典和TryGetValue

将操作从编辑页重定向到带参数的索引页

未在Windows上运行的Maui项目

用于获取字符串的最后12个字符的正则表达式(空格除外)

如何使用.NET Aspire从Blazor应用程序与GRPC API通信?

如何在C#中从MongoDB IPipelineStageDefinition中获取聚合命令的字段/选项?

工厂类是如何在.NET 8中注册的?

C#中使用ReadOnlySpan的泛型类型推理