创建通用列表的映射以一次初始化多个ComboBox

时间:2017-09-19 08:18:21

标签: c# wpf dictionary generics types

我想创建一个地图,其中属性对象的名称作为键,类型对象的列表作为值。

在我的情况下,我想要一张地图:

new

我可以提供联系人或地址列表。

我有一个方法来初始化我的地图,现在它是AbstractEntity,一个Adress和联系人的超类:

Dictionary<string, List<Object1 Or 2>> objectToListofObj1Or2 = new Dictionary<string, List<Object1 Or 2>>();

我这样做是为了预先选择很多rambComboBox,并在视图列表中选择相应的CodeAdress或CodeContact,如下所示:

 public Dictionary<string, List<AbstractEntity>> InitializeMapping()
    {
        Dictionary<string, List<AbstractEntity>> objectToListContactCorrespondance1 = new Dictionary<string, List<AbstractEntity>>();
            objectToListContactCorrespondance1["CodeContactFactAchatExterne"] = ContactsFacturationAchatExterne.Cast<AbstractEntity>().ToList();
//my key is the property name, value is my list already created, here is a List of type Contact
            objectToListContactCorrespondance1["CodeContactContractAchatExterne"] = ContactsContractualisationAchatExterne.Cast<AbstractEntity>().ToList();

//here a list of type Adress
objectToListContactCorrespondance1["CodeAdresseContractAchatExterne"] = AdressesContractualisationAchatExterne.Cast<AbstractEntity>().ToList();

我的地图现在有效,我已经添加了FIRST()。但我的组合框并不是很好。用这一行选择(dataInit允许我初始化视图):

 Dictionary<string, List<AbstractEntity>> mapping = InitializeMappingContact();
foreach (PropertyInfo propertyInfo in dataInit.GetType().GetProperties())
        {
            if (mapping.ContainsKey(propertyInfo.Name) && (alreadyIn.Where(code => code == propertyInfo.Name).ToList().Count == 0))
            {
                if (mapping[propertyInfo.Name].First().GetType() == typeof(Contact))
                {
                    Contact test = (Contact)mapping[propertyInfo.Name].First();
                    propertyInfo.SetValue(dataInit, mapping[propertyInfo.Name].Count == 1 ? test.CodeContact : null, null);
                }
                else
                {
                    Adresse test = (Adresse)mappingContact[propertyInfo.Name].First();
                    propertyInfo.SetValue(dataInit, mappingContact[propertyInfo.Name].Count == 1 ? test.CodeAdresse : null, null);
                }
            }
        }

否则,如果我不使用foreach和Initialize方法,我必须手动逐行进行,如下所示:

propertyInfo.SetValue(dataInit, mappingContact[propertyInfo.Name].Count == 1 ? test.CodeContact : null, null);

我想这样做:

dataInit.CodeAdresseContractAchatSVD = AdressesContractualisationAchatSVD.Count == 1 ? AdressesContractualisationAchatSVD.First().CodeAdresse : null;

1 个答案:

答案 0 :(得分:-1)

我必须检查地图中的列表是否为空,然后我才能得到我的列表类型:

foreach (PropertyInfo propertyInfo in dataInit.GetType().GetProperties())
        {
            if (mappingContact.ContainsKey(propertyInfo.Name) && (alreadyIn.Where(code => code == propertyInfo.Name).ToList().Count == 0))
            {
                if (mappingContact[propertyInfo.Name].FirstOrDefault() != null)
                {
                    if (mappingContact[propertyInfo.Name].First().GetType() == typeof(Contact))
                    {
                        Contact test = (Contact)mappingContact[propertyInfo.Name].First();
                        propertyInfo.SetValue(dataInit, mappingContact[propertyInfo.Name].Count == 1 ? test.CodeContact : null, null);
                    }
                    else
                    {
                        Adresse test = (Adresse)mappingContact[propertyInfo.Name].FirstOrDefault();
                        propertyInfo.SetValue(dataInit, mappingContact[propertyInfo.Name].Count == 1 ? test.CodeAdresse : null, null);
                    }
                }
            }
        }