C# 中的匿名类型提供了一种创建轻量级临时对象的便捷方法。但是,在声明范围之外访问这些对象可能具有挑战性。
请考虑下面的示例代码:
void FuncB() { var obj = FuncA(); Console.WriteLine(obj.Name); } FuncA() { var a = (from e in DB.Entities where e.Id == 1 select new { Id = e.Id, Name = e.Name }).FirstOrDefault(); return a; }
这里,在 FuncA 方法中创建了一个匿名类型对象,并且作为 obj 返回。然而,在 FuncB 方法中,编译器抱怨 obj 不包含 Name 的定义。
为什么我们不能访问其声明范围之外的匿名类型对象的属性?
匿名类型本质上是编译器生成的实现强类型接口的类。创建匿名类型时,编译器会为创建的每个唯一匿名类型生成唯一的类型名称。这些类型对于声明它们的程序集来说是唯一的,并且无法在该程序集外部访问。
我们可以在其声明范围之外访问匿名类型对象吗?
从技术上讲,是的。但是,由于潜在的性能损失和安全问题,强烈建议不要这样做。
一种称为“通过示例进行转换”的方法涉及使用反射将匿名类型对象转换为已知的示例类型。但是,此解决方案很复杂、不可靠,并且可能会随着将来的编译器更改而中断。
public void FuncB() { var example = new { Id = 0, Name = string.Empty }; var obj = CastByExample(FuncA(), example); Console.WriteLine(obj.Name); }
需要注意的是,访问声明范围之外的匿名类型对象可能会导致意外行为,通常不建议这样做.
以上是我可以访问声明范围之外的 C# 匿名类型对象吗?的详细内容。更多信息请关注PHP中文网其他相关文章!