声明匿名类型变量后访问,ViewModel赋值时empleadoCompleto始终为空求助
嘿,我来帮你搞定这个匿名类型的问题!你遇到的变量始终为null的情况,大概率是因为没摸透匿名类型的特性,咱们一步步拆解:
为什么你的匿名类型变量总是null?
首先得明确:匿名类型是C#编译器自动生成的引用类型,默认值是null,但如果你的变量一直是null,肯定是声明或赋值环节出了问题,常见的坑有这几个:
1. 外部声明变量时没做正确的类型初始化
你可能在foreach外面这么写:
var empleadoCompleto = null; // 大错特错!编译器根本没法推断这个变量的类型 foreach(var emp in 你的数据源) { empleadoCompleto = new { Id = emp.Id, Nombre = emp.Nombre }; }
这种写法要么直接编译报错,要么就算勉强运行,变量也没法正确接收匿名类型的实例,自然一直是null。
2. 试图把匿名类型塞进强类型的ViewModel列表
如果你的ViewModel是强类型集合(比如List<EmpleadoVM>),直接加匿名类型进去肯定不行——类型不匹配,这时候你可能误以为是变量null,其实是类型转换失败导致的异常(或者编译错误)。
正确的解决姿势
根据你的需求,分三种场景给你方案:
场景1:只需要在循环内创建并添加到ViewModel
最简单的方式,直接在循环内部声明匿名类型,用完就丢:
// 如果你ViewModel是弱类型集合(比如List<object>或List<dynamic>) var viewModel = new List<object>(); foreach(var emp in 你的数据源) { // 直接在循环里创建匿名类型实例 var empleadoCompleto = new { Id = emp.Id, Nombre = emp.Nombre, // 其他你需要的属性,比如Departamento = emp.Departamento.Nombre }; viewModel.Add(empleadoCompleto); }
场景2:需要在循环外也能访问这个匿名类型变量
如果必须在循环外保留变量,得先给它一个“种子”实例让编译器推断类型:
// 用一个空的匿名实例初始化,确保属性和后续要创建的一致 var empleadoCompleto = new { Id = 0, Nombre = string.Empty }; var viewModel = new List<object>(); foreach(var emp in 你的数据源) { empleadoCompleto = new { Id = emp.Id, Nombre = emp.Nombre }; viewModel.Add(empleadoCompleto); } // 循环外也能正常访问属性了 Console.WriteLine($"最后一个员工:{empleadoCompleto.Nombre}");
场景3:ViewModel是强类型集合(更推荐的做法)
如果你的ViewModel本来就是强类型,别用匿名类型了,直接创建ViewModel的实例:
// 先定义你的ViewModel类 public class EmpleadoViewModel { public int Id { get; set; } public string Nombre { get; set; } // 其他需要的属性 } // 然后在循环里: var viewModel = new List<EmpleadoViewModel>(); foreach(var emp in 你的数据源) { var empleadoVM = new EmpleadoViewModel { Id = emp.Id, Nombre = emp.Nombre }; viewModel.Add(empleadoVM); }
这种方式类型安全,后续维护也方便,比匿名类型靠谱多了。
最后再提醒你几个细节
- 匿名类型的属性默认是只读的,没法后续修改
- 匿名类型只能在当前方法内部直接使用,没法作为方法返回值(除非用object或dynamic,但不推荐)
- 如果你的匿名类型实例始终是null,检查一下创建它的逻辑——是不是数据源里的
emp本身是null?或者某个属性赋值时返回null?但匿名类型实例本身只要你写了new { ... }就不会是null,除非你显式赋值empleadoCompleto = null。
内容的提问来源于stack exchange,提问作者user9065477
相关产品推荐
相关产品推荐

