由于垃圾收集器(GC)会清理任何对象,因此,匿名类型是可以从函数返回的。不过在定义范围之外,匿名类型只是一个object的实例而已。不幸的是,返回一个object将会使智能感知技术无效,而且还会破坏匿名类型的强类型特性。虽然你可以通过反射来重新找出该匿名类型的功能,不过,这也将使得这个本来很舒服的东西变得不那么舒服了。下面示例就是一个从函数返回匿名类型的例子,不过在实际应用当中,最好还是只在定义范围内使用匿名类型。
示例 从方法中返回匿名类型将破坏匿名类型的强类型特性
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
namespace ReturnAnonymousTypeFromMethod
{
class Program
{
static void Main(string[] args)
{
var anon=GetAnonymous();
Type t=anon.GetType();
Console.WriteLine(t.GetProperty("Stock").GetValue(anon,null));
Console.ReadLine();
}
public static object GetAnonymous()
{
var stock=new{Stock="MSFT",Price="32.45"};
return stock;
}
}
}
虽然反射玩起来很爽,不过编写示例所示的那种代码不仅会很慢而且还会很痛苦。(另外,像示例那样的代码还很容易出现bug,因为GetType、GetProperty以及GetValue都可能会返回空值)