【问题标题】:Add an anonymous class of object to an anonymous list将对象的匿名类添加到匿名列表
【发布时间】:2013-01-28 14:24:14
【问题描述】:

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

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;
 } 

【问题讨论】:

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


    【解决方案1】:

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

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

    这将有ContractGroupKey 和ContactGruopTLK 作为long 属性,Contacts 作为List&lt;T&gt; 其中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 等)

    【讨论】:

    • 感谢您的回复。我非常喜欢您的书。我可以理解创建类比使用匿名类型更有价值。我确实关心变量命名。我正在用类编写上面的代码。
    【解决方案2】:

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

    【讨论】:

    • 虽然写一个类可能是最好的做法,但如果你使用泛型或dynamic参数,你实际上可以将匿名类型变量传递给方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多