如何将数据向下一级添加到IEnumerable类型?



我正在做.Net项目。我在下面有我的产品型号。

class Product
{
public IEnumerable<OptionData> Options { get; set; }
}

然后我在下面有选项数据模型。

public class OptionData
{
public Colour PrimaryColour { get; set; }
public Colour SecondaryColour { get; set; }
public IEnumerable<SizeData> Sizes { get; set; }
}

然后我在下面有SizeData模型。

public class SizeData
{
public string KeycodeNumber { get; set; }
public Size Size { get; set; }
}

然后我在下面有我的尺寸模型。

public class Size
{
public string Name { get; set; }
}

然后,我使用这些模型将数据发送到某个消息传递系统。就我而言,它是融合的卡夫卡。

Options = new Option[]
{
new Option
{
PrimaryColour = new CodeNamePair
{
Name = "White",
},
SecondaryColour = new CodeNamePair
{
Name = "red",
},
Sizes = new SizeElement[]
{
new SizeElement
{
Size = new KafkaProductEvent.Size
{
Name = "10"
},
KeycodeNumber = 232
}
}
}
}

然后通过消费者我提取数据。我能够获得主要颜色或次要颜色,如下所示。

IEnumerable<object> options = (IEnumerable<object>)((GenericRecord)response.Message.Value["Product"])["Options"];
foreach (var data in options)
{
OptionData optionData = new OptionData()
{
PrimaryColour = new Colour()
{
Name = (string)((GenericRecord)((GenericRecord)data)["PrimaryColour"])["Name"],
},
SecondaryColour = new Colour()
{
Name = (string)((GenericRecord)((GenericRecord)data)["SecondaryColour"])["Name"]
}
};
}

然后我也想获取尺寸数据。我尝试过这样的事情。

Sizes = new SizeData[]
{
new SizeData()
{
Size = new ProductEvents.Size()
{
Name = "";
}
}
}

我不确定如何从上面获取大小名称。有人可以帮我找出来吗?任何帮助将不胜感激。谢谢

我在您发布的代码中看到的主要挑战是您用于反序列化具有多个聚合对象的复杂数据模型的客户端适配器公开的 API,您正在做的事情的挑战是,将每个层次结构中的每条记录类型转换为GenericRecord,然后将类型转换为实际的 .Net 类型对象, 这意味着随着聚合层次结构的增长,反序列化实际对象将变得极其复杂,尤其是对于聚合集合:

还有一点与反序列化Options有关:

class Product
{
public IEnumerable<OptionData> Options { get; set; }
}

您的代码是:

IEnumerable<object> options = (IEnumerable<object>)((GenericRecord)response.Message.Value["Product"])["Options"];

我想知道的是为什么你不能类型转换为IEnumerable<OptionData>,让它变得简单,让我们假设如果这是不可能的,那么在枚举IEnumerable<object> options为什么它仍然不能类型转换为OptionData对象时,适配器的挑战或你正在使用的方法是它需要完整的对象和层次结构/属性名称意识来反序列化, 理想情况下,一旦你像Product在这种情况下填充顶级对象,其余的都应该递归填充,一个很好的例子是Newtonsoft Json,它会自动填充任何复杂的对象,将使任何内容不可用为 null/默认值,并且需要最少的反序列化代码。

实际上,您可以做的是开发自己的适配器,该适配器通过反射读取属性详细信息并填充输入中可用的数据或丢弃它。现在假设这就是您作为 API 所拥有的全部内容,那么以下将是方法:

IEnumerable<object> options = (IEnumerable<object>)((GenericRecord)response.Message.Value["Product"])["Options"];
foreach (var data in options)
{
OptionData optionData = new OptionData()
{
PrimaryColour = new Colour()
{
Name = (string)((GenericRecord)((GenericRecord)data)["PrimaryColour"])["Name"],
},
SecondaryColour = new Colour()
{
Name = (string)((GenericRecord)((GenericRecord)data)["SecondaryColour"])["Name"]
},
Sizes = new List<SizeData>() // Initialize Collection Here  
};
IEnumerable<object> SizesEnumerable = (IEnumerable<object>)(((GenericRecord)data)["Sizes"]);
foreach (var size in SizesEnumerable)
{
var sizeValue = new SizeData
{
KeycodeNumber = (string)((GenericRecord)size)["KeycodeNumber"],
Size = new Size
{
Name = (string)((GenericRecord)((GenericRecord)size)["Size"])["Name"]
}
};
((List<SizeData>)optionData.Sizes).Add(sizeValue); // Add Data here
}
}

有什么区别?

  1. 您正在尝试使用对象初始值设定项来填充IEnumerable<SizeData> Sizes以填充集合,但这不提供根据您的情况进行进一步处理的选项
  2. 另请注意,我已经将IEnumerable<SizeData> SizesList<SizeData>,因为我们无法使用对象初始值设定项,所以我们不能使用数组,因为我们事先不知道大小
  3. 进一步使用与您相同的逻辑来填充数据

最新更新