如何访问其声明范围之外的匿名类型的对象?
例如
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; }
LukeH.. 27
正如其他答案所述,你真的不应该这样做.但是,如果你坚持,那么有一个令人讨厌的黑客被称为"通过示例铸造",这将允许你这样做.这里和这里有几篇文章中提到了这种技术.
public void FuncB() { var example = new { Id = 0, Name = string.Empty }; var obj = CastByExample(FuncA(), example); Console.WriteLine(obj.Name); } private object FuncA() { var a = from e in DB.Entities where e.Id == 1 select new { Id = e.Id, Name = e.Name }; return a.FirstOrDefault(); } private T CastByExample(object target, T example) { return (T)target; }
(虽然其中一篇文章的作者说他也不想与之相关联,但我不能因此而受到赞誉.他的名字可能很熟悉.)
正如其他答案所述,你真的不应该这样做.但是,如果你坚持,那么有一个令人讨厌的黑客被称为"通过示例铸造",这将允许你这样做.这里和这里有几篇文章中提到了这种技术.
public void FuncB() { var example = new { Id = 0, Name = string.Empty }; var obj = CastByExample(FuncA(), example); Console.WriteLine(obj.Name); } private object FuncA() { var a = from e in DB.Entities where e.Id == 1 select new { Id = e.Id, Name = e.Name }; return a.FirstOrDefault(); } private T CastByExample(object target, T example) { return (T)target; }
(虽然其中一篇文章的作者说他也不想与之相关联,但我不能因此而受到赞誉.他的名字可能很熟悉.)
您无法从函数返回匿名类型.
从MSDN文档:
要在方法边界外传递匿名类型或包含匿名类型的集合,必须先将类型转换为对象.然而,这打败了匿名类型的强类型.如果必须存储查询结果或将它们传递到方法边界之外,请考虑使用普通的命名结构或类而不是匿名类型.