有没有办法从方法返回匿名types?

我知道我不能写一个方法,如:

public var MyMethod() { return new{ Property1 = "test", Property2="test"}; } 

我可以这样做:

 public object MyMethod() { return new{ Property1 = "test", Property2="test"} } 

但我不想做第二种select,因为如果我这样做,我将不得不使用反思。


为什么我想这样做:

今天我有一个方法在我的aspx页面返回一个datatable作为结果,我不能改变它 ,我试图将此数据表转换为一个匿名方法与我想要的属性。 我不想创build一个类只是为了做到这一点,因为我将需要多次执行相同的查询,我想创build一个返回匿名types的方法将是一个很好的理想。

将它作为System.Object返回是从方法返回匿名types的唯一方法。 不幸的是,没有其他方法可以做到这一点,因为匿名types是专门devise的,以防止它们以这种方式使用。

有一些技巧,您可以做与返回一个Object ,使您可以closures结合起来。 如果您对此解决方法感兴趣,请阅读方法不能返回匿名types? 真? 。

免责声明:即使我链接的文章确实显示了一个解决方法,并不意味着这是一个好主意。 我强烈build议您在创build常规types时使用此方法更安全,更易于理解。

或者,您可以使用.NET 4.0及更高版本中的Tuple类:

http://msdn.microsoft.com/en-us/library/system.tuple(v=vs.110).aspx

 Tuple<string, string> Create() { return Tuple.Create("test1", "test2"); } 

那么你可以像这样访问属性:

 var result = Create(); result.Item1; result.Item2; 

最简单的解决scheme是创build一个类,将值传递给属性,然后将其返回。 如果匿名types使你的生活更难,那么你没有正确使用它们。

 public object MyMethod() { return new { Property1 = "test", Property2 = "test" }; } static void Main(..) { dynamic o = MyMethod(); var p1 = o.Property1; var p2 = o.Property2; } 

尽pipe这是一个好主意的警告,但一个dynamic似乎工作得很好,为私人方法。

 private dynamic MyMethod() { return new { Property1 = "test", Property2 = "test" } } 

我认为安德鲁·黑尔是正确的,你只需要返回“对象”。 对于编辑评论,我觉得在OO代码中处理原始对象可能是一种“代码味道”。 有些情况下是正确的,但是大多数情况下,如果要返回相关types,最好定义一个返回接口,或者使用某种基类types。

不,匿名types不能存在于创build它们的上下文之外,因此不能用作方法的返回types。 您可以将实例作为object返回,但为此目的显式创build自己的容器types更好。

对不起,你真的不应该这样做。 你可以用reflection或者通过一个通用的帮助方法来为你返回types,但是这样做实际上是违背语言的。 只要声明这个types,清楚发生了什么事情。

不,不支持在方法之外扩展匿名类的范围。 在这个方法之外,这个类是真正匿名的,reflection是访问它的成员的唯一方法。