C# 将匿名类型的列表强制转换为对象列表

C# 将匿名类型的列表强制转换为对象列表,c#,anonymous-types,C#,Anonymous Types,我正在尝试创建一个匿名列表,该列表可以保存任何数据类型,支持智能感知,但不创建类 所以我找到了以下使用匿名类型的解决方案 var list = new[] { new { Number = 10, Name = "Smith" }, new { Number = 10, Name = "John" } }.ToList(); foreach (var item in list) { Console.WriteLine(item.Name);

我正在尝试创建一个匿名列表,该列表可以保存任何
数据类型
,支持
智能感知
,但不创建

所以我找到了以下使用匿名类型的解决方案

  var list = new[]
  { 
     new { Number = 10, Name = "Smith" },
     new { Number = 10, Name = "John" } 
  }.ToList();

  foreach (var item in list)
  {
    Console.WriteLine(item.Name);
  }
但是如果我想要一个返回高于匿名类型的方法呢

public List<object> GetData()
{

    var list = new[]
    {
        new { Number = 10, Name = "Smith" },
        new { Number = 10, Name = "John" }
    }.ToList();

    return list;
public List GetData()
{
变量列表=新[]
{
新的{Number=10,Name=“Smith”},
新的{Number=10,Name=“John”}
}.ToList();
退货清单;
}

编译时错误:

无法隐式转换类型 “System.Collections.Generic.List”到“System.Collections.Generic.List”

是否可以将匿名类型的列表强制转换为支持intellisense的对象列表

更新:


我们不想创建类型的原因是,我们只想使用匿名类型进行一些数据操作,并填充一些其他对象,仅此而已。

以下是可能的方法:

  • 返回
    列表
    ,这意味着您在接收端没有intellisense
  • 返回一个
    列表
    ,这意味着您在接收端没有intellisense,但可能比通过反射更容易访问您知道的成员
  • 返回一个
    列表
    ,然后您必须提供一个示例,说明
    T
    的外观,这样在运行时不会比
    动态
    更安全
  • 返回C#7附带的新类型的元组
  • 第1点和第2点可以通过确保列表为该类型轻松解决:

    ...
    }.ToList<object>();
    
    您将在您的案例中使用它,如下所示:

    var d = AnonymousCast(GetData()[0], new { Number = 0, Name = "" });
    
    这并不比使用
    dynamic
    更安全,因为无法保证从
    GetData
    返回的对象实际上是该匿名类型

      var list = new[]
      { 
         new { Number = 10, Name = "Smith" },
         new { Number = 10, Name = "John" } 
      }.ToList();
    
      foreach (var item in list)
      {
        Console.WriteLine(item.Name);
      }
    

    简而言之,使用命名的类型。

    我怀疑创建一个类型将是这里解决方案的最短/最干净的路径。为什么要尽一切努力避免这种情况?匿名类型不应该在泛型或本地上下文之外使用,因此不能。您必须返回
    对象
    动态
    或元组类型或类似类型,但不能返回带intellisense的匿名类型。为此,我们已经有了正确的解决方案,创建一个适当的命名类型。新C#编译器中的元组支持命名,但这是一个技巧,它很快就会崩溃。同样,正确的方法是使用适当的命名类型。返回
    dynamic
    then,并期待最好的结果。它不会给你智能感知,但会让你很容易找到里面的成员。如果你能使用c#7功能-你可以使用命名元组。我能传递
    GetData()
    而不是
    GetData()[0]
    ?添加了
    匿名castall
    ,但不要使用这些!您不妨使用
    动态
    。我可以很容易地做
    AnonymousCast(o,new{Foo=42,Bar=17})
    ,它会编译,但不会运行。您将获得intellisense,因为您要求intellisense提供什么,而不是对象实际提供什么。我猜这与您发布的信息相同。非常感谢你的努力。
    var d = AnonymousCast(GetData()[0], new { Number = 0, Name = "" });