什么是匿名类的返回类型

M J*_*cob 3 c#

我有一个曾经有一个字符串返回类型的类.现在我发现我需要返回多个字符串.我想要返回如下内容:

public string Test()
{
  return ( new { ID = 5, Name= "Dave" } );
}
Run Code Online (Sandbox Code Playgroud)

这是否可能,如果是这样,那么返回类型是什么?我知道这不是字符串..

Eri*_*ert 9

正如其他人所说,这里最好的办法就是做出名义上的类型.我建议名义类型与匿名类型具有相同的特征; 也就是说,您应该考虑使类型不可变,并考虑使其表现出值相等.

可能返回一个匿名类型的对象,然后使用采用各种卑鄙的技术在其他地方返回的实例.您可以将对象转换为"动态"(在C#4中),然后使用匿名类型的属性,但这很慢并且缺少编译时类型检查.

您还可以使用"逐个示例"技巧,它可以让您进行编译时类型检查.但是,该技巧仅在匿名源对象和匿名示例对象来自同一程序集时才有效.

static T CastByExample<T>(object source, T example) where T : class
{
    return source as T;
}

static object ReturnsAnonymous() { return new { X = 123 }; }

static void DoIt()
{
    object obj = ReturnsAnonymous();
    var example = new { X = 0 };
    var anon = CastByExample(obj, example);
    Console.WriteLine(anon.X); // 123
}
Run Code Online (Sandbox Code Playgroud)

看看这是多么鬼鬼祟祟?我们使用方法类型推断和局部变量类型推断来告诉编译器"这两个东西是同一类型".这允许您将匿名类型导出为对象并将其强制转换为匿名类型.

但你可能不应该这样做; 如果你采取这种偷偷摸摸的技巧,那么你应该首先简单地定义名义类型.另外,就像我说的那样,只有在同一个程序集中的代码中创建示例对象时,该技巧才有效; 两个不同程序集中的两个"相同"匿名类型统一为相同类型.