将动态转换为对象

pet*_*ski 7 c# dynamic-typing dynamictype

这是我的代码:

MyClass here = new MyClass();
IEnumerable<MyClass> vats = (IEnumerable<MyClass>)here.All();
Run Code Online (Sandbox Code Playgroud)

All()方法返回IEnumerable <dynamic>.我想将其转换为IEnumerable <MyClass>.上面的行没有工作,它说无法将'd__15'类型的对象强制转换为'System.Collections.Generic.IEnumerable`1 [MyClass]'.

我也尝试过:

 IEnumerable<MyClass> vats = here.All() as IEnumerable<MyClass>;
Run Code Online (Sandbox Code Playgroud)

但它返回null.

Jon*_*eet 6

与dbaseman的答案(和AKX的评论)类似,我会使用Cast:

IEnumerable<MyClass> vats = here.All().Cast<MyClass>();
Run Code Online (Sandbox Code Playgroud)

你需要usingLINQ 的指令:

using System.Linq;
Run Code Online (Sandbox Code Playgroud)

在您的文件的顶部.如果Select方法无法识别,听起来你还没有.

请注意,这假设每个值确实是一个MyClass引用.

编辑:如果您希望能够通过索引访问值,我建议使用ToList:

List<MyClass> vats = here.All().Cast<MyClass>().ToList();
Run Code Online (Sandbox Code Playgroud)

虽然ToArray也可以,但在大多数情况下,我个人更喜欢列表而不是数组,因为它们更灵活.

编辑:听起来你的结果实际上是充满了ExpandoObject.您需要MyClass从每个项目创建一个新实例,例如

List<MyClass> vats = here.All()
                         .Select(item => new MyClass(item.Name, item.Value))
                         .ToList();
Run Code Online (Sandbox Code Playgroud)

或者可能:

List<MyClass> vats = here.All()
                         .Select(item => new MyClass {
                                     Name = item.Name,
                                     Value = item.Value,
                                 })
                         .ToList();
Run Code Online (Sandbox Code Playgroud)

只是一个例子,我不希望直接工作 - 我们不能做得更好,因为我们对你的结果实际返回的方式一无所知.

听起来好像你在这里,我害怕.