代码之家  ›  专栏  ›  技术社区  ›  Edward Tanguay

如何将变量定义为类型列表

  •  4
  • Edward Tanguay  · 技术社区  · 8 年前

    我在监视窗口中看到下面的LINQ语句

    model.UserLanguages = (from u in db.Users
                        join l in db.Languages on u.LanguageId equals l.Id
                        select new {UserName = u.LastName, Language = l.Name}).ToList();
    

    返回类型为的变量 System.Collections.Generic.List<<>f_AnonymousType1<string,string>> .

    我需要将它赋给模型类的属性,所以我需要能够显式地命名它的类型。像这样:

    public List<{string, string}> UserLanguages { get; set; }
    

    但是,由于这不是正确的语法,当然,我会得到一个错误。

    当我设置为:

    public List<object> UserLanguages { get; set; }
    

    我得到错误:

    The type "System.Collections.Generic.List<<anonymous type: string UserName, string Language>>" cannot be converted to "System.Collections.Generic.List<object>"
    
    2 回复  |  直到 8 年前
        1
  •  7
  •   MakePeaceGreatAgain    8 年前

    你不能这样做,一个匿名类只是-好吧,匿名-它没有一个你可以在任何地方使用的名字。从 MSDN :

    不能声明字段、属性、事件或返回类型 具有匿名类型的方法。

    而是创建一个 命名类 然后创建它的一个实例

    class MyClass
    {
        public string UserName { get; set; }
        public string Language { get; set; }
    }
    

    现在,从查询中创建此类的实例:

    model.UserLanguages = (from u in db.Users
                    join l in db.Languages on u.LanguageId equals l.Id
                    select new MyClass {UserName = u.LastName, Language = l.Name}).ToList();
    

    哪里 UserLanguages 是一个 List<MyClass> . 这使您的API的任何用户都清楚,最后一个实例中的某个实例 UserName 和A Language .

    另一种没有课的方法是 Dictionary<string, string> 相反。

    model.UserLanguages = (from u in db.Users
                    join l in db.Languages on u.LanguageId equals l.Id
                    select new MyClass {UserName = u.LastName, Language = l.Name}).ToDictionary(x => x.UserName, x => x.LastName);
    

    但这似乎不太直观,因为用户必须知道 Key 适用于 用户名 ,而 Value 是一个 语言 .

        2
  •  -1
  •   Nitin S    8 年前

    您可以使用 dynamic 对象aka System.Dynamic.ExpandoObject

    将模型属性声明为 public List<System.Dynamic.ExpandoObject> UserLanguages { get; set; }

    以下是psuedo代码:

    void Main()
    {
        Test db = new Test();
        MyModel model = new MyModel();
        model.UserLanguages = (from u in db.Users
                        join l in db.Languages on u.LanguageId equals l.Id
                        select new {UserName = u.LastName, Language = l.Name})
                        .Select(x=> {
                            dynamic expando = new System.Dynamic.ExpandoObject();
                            expando.UserName = x.UserName;
                            expando.Language = x.Language;
                            return (System.Dynamic.ExpandoObject)expando;
                        })
                        .ToList();
    
        Console.WriteLine(((dynamic)model.UserLanguages[0]).UserName);
    }
    
    public class Test
    {
        public Test()
        {
            Users = new List<User>(){
                new User(){
                    LanguageId = 1,
                    LastName = "Hello"
                }
            };
            Languages = new List<Language>(){
                new Language(){
                    Id = 1,
                    Name = "Test"
                }
            };
        }
        public List<User> Users{get;set;}
        public List<Language> Languages{get;set;}
    }
    
    public class User
    {
        public int LanguageId{get;set;}
        public string LastName{get;set;}
    
    }
    
    public class Language
    {
        public int Id{get;set;}
        public string Name{get;set;}
    }
    
    public class MyModel
    {
        public List<System.Dynamic.ExpandoObject> UserLanguages { get; set; }
    }