Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将动态转换为对象_C#_Dynamic Typing_Dynamictype - Fatal编程技术网

C# 将动态转换为对象

C# 将动态转换为对象,c#,dynamic-typing,dynamictype,C#,Dynamic Typing,Dynamictype,这是我的密码: MyClass here = new MyClass(); IEnumerable<MyClass> vats = (IEnumerable<MyClass>)here.All(); All方法返回IEnumerable。我想把它转换成IEnumerable。上面的那条线不清楚;不起作用,它表示无法将类型为“d_u15”的对象强制转换为类型为“System.Collections.Generic.IEnumerable`1[MyClass]” 我还尝试:

这是我的密码:

MyClass here = new MyClass();
IEnumerable<MyClass> vats = (IEnumerable<MyClass>)here.All();
All方法返回IEnumerable。我想把它转换成IEnumerable。上面的那条线不清楚;不起作用,它表示无法将类型为“d_u15”的对象强制转换为类型为“System.Collections.Generic.IEnumerable`1[MyClass]”

我还尝试:

 IEnumerable<MyClass> vats = here.All() as IEnumerable<MyClass>;

但它返回null。

您只需强制转换每个单独的对象:

MyClass[] vats = here.All().Select(item => (MyClass)(dynamic)item).ToArray();

与dbaseman的回答和AKX的评论类似,我将使用Cast:

在文件的顶部。如果无法识别Select方法,则听起来您还没有得到它

注意,这假设每个值实际上都是MyClass引用

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

或者可能:

List<MyClass> vats = here.All()
                         .Select(item => new MyClass {
                                     Name = item.Name,
                                     Value = item.Value,
                                 })
                         .ToList();
这只是一个例子,我不希望马上就能奏效——我们做得再好不过了,因为我们对结果的实际返回方式一无所知


我想,这听起来确实有些过头了。

在创建解决方案之前,首先要解决的是对象在运行时将具有什么类型。从您的注释中可以看出它们将是ExpandoObject,并且假设MyClass不是从ExpandoObject派生的,您不能使用.Cast方法,因为它只支持强制转换而不支持自定义转换

有一个技巧可以用来使用

从这里得到一个可以使用的扩展方法

public static IEnumerable<T> Convert<T>(this IEnumerable<dynamic> self){
    var jsSerializer = new JavaScriptSerializer();
    foreach(var obj in self){
        yield return jsSerializer.ConvertToType<T>(obj);
    }
}
在你的情况下,那么你所要做的就是改变投入双向飞碟答案转换

List<MyClass> vats = here.All().Convert<MyClass>().ToList();

由于JavaScriptSerializer本不打算这么做,但它确实解决了这个问题,所以这有点骇人听闻。

@Tigran就在这里。看看Massive.cs文件。你为什么不能在代码中保持动态?@Scree我不明白。哪些值?@dbaseman如vats[0],vats[1]。我只能这样访问这些值。@AKX这取决于它是自定义转换还是向上/向下转换。后者在两种情况下都有效,前者仅在发布的版本中有效here@Scree再次编辑。我想这就是您要寻找的-要使用括号表示法,它必须是一个数组或列表。@dbaseman I get error无法将类型“System.Dynamic.ExpandoObject”转换为“MyClass”,以及在哪里查找我的值?如vats[0],vats[1]。我能访问的所有值如下that@srcee如果希望使用索引器而不是迭代整个列表,则需要在调用select@Srcee:您可以仅从一个序列中迭代值,但如果需要索引器,则需要列表或数组。但听起来你对C和LINQ还很陌生-在这种情况下,如果可以的话,我建议你暂时不要使用动态输入。。。这将使理解基础变得更加困难…我相信您的最后一点可以使用示例代码或精化。我觉得,如果一个人已经知道了两者的区别,他就会理解你的观点,但对于那些不知道托布既可以是演员,也可以是皈依者的人来说,可能就不是这样了understood@RuneFS:当涉及到动态键入时,情况会变得更糟-但考虑到其他注释,我想在这个特殊的案件中最好不要去调查。。。我怀疑这会让OP更加困惑。
List<MyClass> vats = here.All()
                         .Select(item => new MyClass(item.Name, item.Value))
                         .ToList();
List<MyClass> vats = here.All()
                         .Select(item => new MyClass {
                                     Name = item.Name,
                                     Value = item.Value,
                                 })
                         .ToList();
public static IEnumerable<T> Convert<T>(this IEnumerable<dynamic> self){
    var jsSerializer = new JavaScriptSerializer();
    foreach(var obj in self){
        yield return jsSerializer.ConvertToType<T>(obj);
    }
}
List<MyClass> vats = here.All().Convert<MyClass>().ToList();