什么是匿名类的返回类型

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

public string Test() { return ( new { ID = 5, Name= "Dave" } ); } 

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

您返回的对象确实有一个类,但它是匿名的,因此您无法在代码中指定它。 您只需将其作为object引用返回:

 public object Test() { return new { ID = 5, Name= "Dave" }; } 

请注意,匿名类型在方法范围之外是未知的,因此reflection是访问其属性的唯一方法。

如果您希望能够方便地使用返回的对象,则应声明一个类:

 public class TestResult { public int ID { get; set; } public string Name { get; set; } } public TestResult Test() { return new TestResult() { ID = 5, Name= "Dave" }; } 

另一种选择是使用现有的类,如果它符合您的目的。 KeyValuePair接近你使用的,但是属性当然会被命名为KeyValue而不是IDName

 public KeyValuePair Test() { return new KeyValuePair(5, "Dave"); } 

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

可以将匿名类型作为对象返回,然后使用各种偷偷摸摸的技术使用其他地方返回的实例。 您可以将对象转换为“动态”(在C#4中),然后使用匿名类型的属性,但这很慢并且缺少编译时类型检查。

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

 static T CastByExample(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 } 

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

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

这是不可能的,因为匿名类仅在当前上下文中有效。 如果你需要返回一个对象,那么你需要创建一个真正的类。

我假设你意外地将string作为返回类型。

Anonymous type是直接从object派生的类类型。

您可以从方法返回它作为返回类型的object 。 看看这个 。

不,这是不可能的。 你的选择是:

  1. 为返回值定义一个真实的类,
  2. 使用System.Tuple,或
  3. 使用参数(可能是最不好的选项)。

您可以为此创建结构(或类)。

 public struct IdAndName { public int Id; public string Name; public IdAndName(int id, string name) { ID = id; Name = name; } } 

您也可以使用元组(但不建议这样做,因为属性未命名。

 class NewString { public int ID { get; set; } public string Name { get; set; } } public NewString Test() { return ( new NewString() { ID = 5, Name = "Dave" } ); } 

🙂