如何将列表值映射到新对象属性

时间:2020-07-26 15:28:55

标签: c# .net dictionary enumerable

我有一本像这样的字典

public Dictionary<string, List<string>> Options { get; set; }

如您所见,它以一个字符串为Key和一个以列表形式的字符串集合为Value

目标是创建多个具有3个属性的ProductVariant类型的对象。 Option1Option2Option3

对于Value中的每个Options,我想将Option1设置为Option [0]值,然后Option2属性获得Option[1]值。

我试图做这样的事情,但是它只能得到其中一种特质,并且不起作用,因为那不是我想要达到的目的。

foreach (var thing in item.Options.ElementAt(0).Value)
{
    variants.Add(new ProductVariant
    {
        Option1 = thing
    });
}

因此,最重要的是..我想为字典中的每个项目将Option1Option2分配给字典中的相应值。

赞这个 enter image description here

如何正确执行此操作?

1 个答案:

答案 0 :(得分:1)

一种方法是使用反射,如下面的示例所示:

public class ProductVariant
    {
        public ProductVariant()
        {
            
        }
        public string Key { get; set; }
        public string Option1 { get; set; }
        public string Option2 { get; set; }
        public string Option3 { get; set; }

        public static IEnumerable<ProductVariant> GetProductVariants(Dictionary<string, List<string>> options)
        {
            foreach (var optionList in options)
            {
                var pv = new ProductVariant();
                pv.Key = optionList.Key;

                var props = pv.GetType()
                    .GetProperties()
                    .Where(x=>x.CanWrite && x.CanWrite)
                    .Where(x=>x.Name!="Key")
                    .ToArray();

                for (int i = 0; i < props.Length; i++)
                {
                    props[i].SetValue(pv,optionList.Value[i]);
                }

                yield return pv;
            }
        }
    }

我测试了这种方法并且正在工作。您仍然需要进行一些验证以避免错误。

您可以在此处查看该方法:https://dotnetfiddle.net/KCKhaS