首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将对象转换为ValueTuple

将对象转换为ValueTuple
EN

Stack Overflow用户
提问于 2019-09-09 20:38:37
回答 2查看 4.9K关注 0票数 1

给出了类页的OnNavigatedTo方法

代码语言:javascript
复制
    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        if (e.Parameter != null)
        {
            var o = (ValueTuple<object, object>) e.Parameter;
            Content = (UIElement) o.Item1;
            this.DataContext = o.Item2;
        }

        base.OnNavigatedTo(e);
    }

我想将e.Parameter (类型为object)转换为ValueTuple<object, object>

该参数作为Frame.Navigate调用的一部分携带了我想要通过的实例,如下所示:

Frame.Navigate(typeof(SomePage), (view, viewModel));

演员们应该能工作。它应该是安全的,因为我认为ValueTuple<X, Y>应该能够被扔给ValueTuple<object, object>,对吗?

但是,它会引发无效的强制转换异常

这个演员怎么了?

如何将包含元组实例的类型object的引用转换为对元组的类型化引用?

更多信息

引发的确切例外是:

'System.ValueTuple2[System.Object,Reflight.Gui.ViewModels.FlightGalleryViewModel]' to type 'System.ValueTuple2System.Object,System.InvalidCastException:“无法转换类型为System.InvalidCastException System.Object的对象”。

e.Parameter.GetType()输出如下:

{Name =“"System.ValueTuple2[[System.Object, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Reflight.Gui.ViewModels.FlightGalleryViewModel, Reflight.Gui.ViewModels, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e" Attributes: Public | Sealed | Serializable | BeforeFieldInit BaseType: {Name = "ValueType" FullName = "System.ValueType"} ContainsGenericParameters: false CustomAttributes: Count = 2 DeclaredConstructors: {System.Reflection.ConstructorInfo[1]} DeclaredEvents: {System.Reflection.EventInfo[0]} DeclaredFields: {System.Reflection.FieldInfo[2]} DeclaredMembers: {System.Reflection.MemberInfo[19]} DeclaredMethods: {System.Reflection.MethodInfo[14]} DeclaredNestedTypes: {System.Reflection.TypeInfo.<get_DeclaredNestedTypes>d__22} DeclaredProperties: {System.Reflection.PropertyInfo[2]} DeclaringMethod: '((System.RuntimeType)e.Parameter.GetType()).DeclaringMethod' threw an exception of type 'System.InvalidOperationException' DeclaringType: null FullName: "System.ValueTuple2[System.Object,2" FullName = "System.ValueTuple2[System.Object,System.Private.CoreLib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=7cec85d7bea7798e,en2 Reflight.Gui.ViewModels,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null]]}程序集:{System.Private.CoreLib,Version=4.0.0.0,Culture=neutral,Version=4.0.0.0}PublicKeyToken=7cec85d7bea7798e:”System.ValueTuple2[[System.Object, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Reflight.Gui.ViewModels.FlightGalleryViewModel, Reflight.Gui.ViewModels, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e" Attributes: Public | Sealed | Serializable | BeforeFieldInit BaseType: {Name = "ValueType" FullName = "System.ValueType"} ContainsGenericParameters: false CustomAttributes: Count = 2 DeclaredConstructors: {System.Reflection.ConstructorInfo[1]} DeclaredEvents: {System.Reflection.EventInfo[0]} DeclaredFields: {System.Reflection.FieldInfo[2]} DeclaredMembers: {System.Reflection.MemberInfo[19]} DeclaredMethods: {System.Reflection.MethodInfo[14]} DeclaredNestedTypes: {System.Reflection.TypeInfo.<get_DeclaredNestedTypes>d__22} DeclaredProperties: {System.Reflection.PropertyInfo[2]} DeclaringMethod: '((System.RuntimeType)e.Parameter.GetType()).DeclaringMethod' threw an exception of type 'System.InvalidOperationException' DeclaringType: null FullName: "System.ValueTuple2[System.Object,System.Private.CoreLib,Reflight.Gui.ViewModels,Version=1.0.0.0,Culture=neutral,“GUID:{4a04084c-cb2b-378 d-a9c-a77abd9ba77e} GenericParameterAttributes:'((System.RuntimeType)e.Parameter.GetType()).GenericParameterPosition‘抛出了'System.InvalidOperationException’GenericParameterPosition类型的异常:‘((System.RuntimeType)e.Parameter.GetType()).GenericParameterPosition’抛出了'System.InvalidOperationException‘GenericTypeArguments:{System.Type2} GenericTypeParameters:{System.Type} HasElementType: false类型的异常。ImplementedInterfaces:{System.Type7} IsAbstract: false IsAnsiClass: true IsArray: false IsArray: false IsAutoLayout: false IsByRef: false IsByRefLike: false IsCOMObject: false IsClass: false IsCollectible: false IsConstructedGenericType: false IsEnum: false IsExplicitLayout: false IsGenericMethodParameter: false IsConstructedGenericType: true #en19: falseIsGenericTypeParameter: false IsImport: false IsInterface: false IsLayoutSequential: false IsMarshalByRef: false IsNested: false IsNestedAssembly: false IsNestedFamORAssem: false IsNestedFamORAssem: false IsNestedFamily: false IsNestedPrivate: false IsNestedPublic: false IsPointer: false IsPrimitive: false IsPublic: false IsSZArray: true IsMarshalByRef: true falseIsSecurityTransparent: false IsSerializable: true IsSignatureType: false IsSpecialName: false IsTypeDefinition: false IsUnicodeClass: false IsValueType: false IsVariableBoundArray: false IsVisible: true MemberType: TypeInfo MetadataToken: 33554856 Module (System.Reflection.MemberInfo):{System.Private.CoreLib.dll} Module:{System.Private.CoreLib.dll} Name:"ValueTuple2" Namespace: "System" ReflectedType: null StructLayoutAttribute: {System.Runtime.InteropServices.StructLayoutAttribute} TypeHandle: {System.RuntimeTypeHandle} TypeInitializer: null UnderlyingSystemType: {Name = "ValueTuple2“FullName =”2" Namespace: "System" ReflectedType: null StructLayoutAttribute: {System.Runtime.InteropServices.StructLayoutAttribute} TypeHandle: {System.RuntimeTypeHandle} TypeInitializer: null UnderlyingSystemType: {Name = "ValueTuple[en19]#,Reflight.Gui.ViewModels.FlightGalleryViewModel,Reflight.Gui.ViewModels,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null]"}

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-09 20:40:19

如何从包含元组实例的类型对象的引用转换为对元组的类型化引用?

你必须选择正确的元组类型。您正在将ValueTuple<MyClass, object>转换为ValueTuple<object, object>,它们是不同的类型。

这很好,例如:

代码语言:javascript
复制
using System;

class Test
{
    static void Main()
    {
        object obj = ("foo", "bar");
        // Casting to the right type works... but a cast to
        // ValueTuple<object, object> would fail.
        var tuple = (ValueTuple<string, string>) obj;
        Console.WriteLine(tuple.Item1); // foo
        Console.WriteLine(tuple.Item2); // bar
    }
}

当然,如果您想要一个ValueTuple<object, object>,您可以这样做:

代码语言:javascript
复制
object myTuple = ((object) instance, new object());

如果您想引用任何值元组,则可能(不幸的是,取决于所针对的框架)可以使用ITuple

代码语言:javascript
复制
using System;
using System.Runtime.CompilerServices;

class Test
{
    static void Main()
    {
        object obj = ("foo", 10);
        var tuple = (ITuple) obj;

        for (int i = 0; i < tuple.Length; i++)
        {
            Console.WriteLine(tuple[i]); // foo then 10
        }
    }
}
票数 12
EN

Stack Overflow用户

发布于 2019-09-09 21:04:48

我已经通过明确的方式解决了这个问题,并像这样调用Frame.Navigate

frame.Navigate(typeof(NavigationPage), ((object)content, (object)vm));

这样,铸造就能工作了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57860911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档