给出了类页的OnNavigatedTo方法
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.ValueTuple
2[System.Object,Reflight.Gui.ViewModels.FlightGalleryViewModel]' to type 'System.ValueTuple2System.Object,System.InvalidCastException:“无法转换类型为System.InvalidCastException System.Object的对象”。
e.Parameter.GetType()输出如下:
{Name =“"System.ValueTuple
2[[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]"}
发布于 2019-09-09 20:40:19
如何从包含元组实例的类型对象的引用转换为对元组的类型化引用?
你必须选择正确的元组类型。您正在将ValueTuple<MyClass, object>转换为ValueTuple<object, object>,它们是不同的类型。
这很好,例如:
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>,您可以这样做:
object myTuple = ((object) instance, new object());如果您想引用任何值元组,则可能(不幸的是,取决于所针对的框架)可以使用ITuple
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
}
}
}发布于 2019-09-09 21:04:48
我已经通过明确的方式解决了这个问题,并像这样调用Frame.Navigate。
frame.Navigate(typeof(NavigationPage), ((object)content, (object)vm));
这样,铸造就能工作了。
https://stackoverflow.com/questions/57860911
复制相似问题