当前位置:  开发笔记 > 编程语言 > 正文

访问C#匿名类型对象

如何解决《访问C#匿名类型对象》经验,为你挑选了2个好方法。

如何访问其声明范围之外的匿名类型的对象?

例如

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

(虽然其中一篇文章的作者说他也不想与之相关联,但我不能因此而受到赞誉.他的名字可能很熟悉.)



1> LukeH..:

正如其他答案所述,你真的不应该这样做.但是,如果你坚持,那么有一个令人讨厌的黑客被称为"通过示例铸造",这将允许你这样做.这里和这里有几篇文章中提到了这种技术.

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

(虽然其中一篇文章的作者说他也不想与之相关联,但我不能因此而受到赞誉.他的名字可能很熟悉.)


如果你使用这个黑客,恐怖分子就会获胜.

2> Paul Suart..:

您无法从函数返回匿名类型.

从MSDN文档:

要在方法边界外传递匿名类型或包含匿名类型的集合,必须先将类型转换为对象.然而,这打败了匿名类型的强类型.如果必须存储查询结果或将它们传递到方法边界之外,请考虑使用普通的命名结构或类而不是匿名类型.

推荐阅读
勤奋的瞌睡猪_715
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有