将匿名对象类添加到匿名列表中

时间:2013-01-28 14:24:14

标签: c# .net list generics anonymous-types

我已经声明了这样的匿名列表,它还包含联系人列表

var ContactGroup = new[] { new { ContactGroupKey = 0, ContactGroupTLK = 0, Desc = "",  Contacts=new List<object>() } }.ToList();

我尝试检查列表,如果ContactGroupKey存在,则仅更新联系人(定义为列表),否则插入新的联系人组。但当我试图在我的匿名列表中添加一个新的联系人组时,它会抛出一个错误“'System.Collections.Generic.List.Add(AnonymousType#2)'的最佳重载方法匹配'有一些无效的参数  “我第一次使用匿名列表。我试图在这种情况下避免上课。任何人都可以建议我在哪里犯了错误?

 while()
 {
    var Contact= new {
                       ContactKey = Convert.ToInt64(DB["ContactKey", "0"]),                       
                       FirstName = DB["FirstName", ""].ToString(),
                       Surname = DB["Surname", ""].ToString(),
                       FullName = DB["Fullname", ""].ToString(),
                       Street = DB["bStreet", ""].ToString(),
                       City = DB["bCity", ""].ToString(),
                     };
     foreach (var item in ContactGroup)
                {
                    if (item.ContactGroupKey == Contact.ClaimContactGroupKey)
                    {
                        item.Contacts.Add(Contact);
                        added = true;
                    }
                }
     if(!added){

      ContactGroup.Add(new {
                           ContactGroupKey = Convert.ToInt64(DB["ContactGroupKey", "0"]),
                           ContactGroupTLK = Convert.ToInt64(DB["TranslationKey", "0"]),
                           Desc = DB["Description", ""].ToString(),
                           Contacts=GenerateList(Contact)
                           });          
       }
 }// End While


public static List<T> GenerateList<T>(T itemOftype)
 {
     List<T> newList = new List<T>();
     return newList;
 } 

2 个答案:

答案 0 :(得分:2)

问题是你使用的匿名类型不一样。您需要在名称,类型和顺序中匹配属性。看看这个:

  ContactGroup.Add(new {
                       ContactGroupKey = Convert.ToInt64(DB["ContactGroupKey", "0"]),
                       ContactGroupTLK = Convert.ToInt64(DB["TranslationKey", "0"]),
                       Desc = DB["Description", ""].ToString(),
                       Contacts=GenerateList(Contact)
                       });

这将ContractGroupKeyContactGruopTLK作为long属性,Contacts作为List<T>,其中T是您的另一种匿名类型。您需要将初始化更改为:

var sampleContact = new { ContactKey = 0L, /* etc */ };
var sampleContactList = new[] { sampleContact }.ToList();
var contactGroup = new[] { new { ContactGroupKey = 0L,
                                 ContactGroupTLK = 0L, 
                                 Desc = "", 
                                 Contacts = sampleContactList } }.ToList();

可以工作 - 但你最好为此创建命名类。最终,感觉这些可能是您系统中的重要实体,因此值得将其作为命名类型进行建模。

(旁注:在你的命名中值得保持一致;通常局部变量是camelCased,所以你应该使用contactGroup而不是ContactGroup等。)

答案 1 :(得分:0)

匿名类型不打算保留当前方法。您无法将它们传递给其他方法。您应该定义一个包含您需要处理的属性的类。