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
的外观,这样在运行时不会比动态
更安全...
}.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 = "" });