什么';s是匿名类的返回类型

本文关键字:返回类型 什么 | 更新日期: 2023-09-27 18:00:08

我有一个类,它过去有一个字符串返回类型。现在我发现我需要返回的不仅仅是字符串。我想退货如下:

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

这可能吗?如果可能,那么返回类型是什么?我知道这不是绳子。。

什么';s是匿名类的返回类型

正如其他人所说,在这里最好做的事情就是生成一个标称类型。我建议名义类型与匿名类型具有相同的特征;也就是说,您应该考虑使类型不可变,并考虑使其显示值相等

可以返回一个匿名类型作为对象,然后使用各种狡猾的技术在其他地方使用返回的实例。您可以将对象强制转换为"dynamic"(在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
}

看看这有多狡猾?我们使用方法类型推理和局部变量类型推理来告诉编译器"这两件事是同一类型的"。这允许您将匿名类型导出为对象,并将其强制转换回匿名类型。

但你可能不应该这样做;如果你采用了这种狡猾的手段,那么你应该首先定义一个名义类型。此外,正如我所说,只有当示例对象在同一程序集中的代码中创建时,该技巧才有效;两个不同程序集中的两个"相同"匿名类型不会统一为同一类型。

您返回的对象确实有一个类,但它是匿名的,因此您不能在代码中指定它。您只需将其作为object参考返回即可:

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

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

如果你想方便地使用返回的对象,你应该声明一个类:

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<int, string> Test() {
  return new KeyValuePair<int, string>(5, "Dave");
}

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

我假设您将string作为返回类型是偶然的。

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

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

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

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

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

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

您也可以使用Tuple<T1,T2>,(但不建议这样做,因为属性没有命名。

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

:)