C# 无法将RuntimeType转换为泛型类型
我正在构造一个类型开关来更改WPV和MVVM中的视图,因此此类型开关如下所示:C# 无法将RuntimeType转换为泛型类型,c#,C#,我正在构造一个类型开关来更改WPV和MVVM中的视图,因此此类型开关如下所示: public class TypeSwitch { readonly Dictionary<Type, Action<object>> matches = new Dictionary<Type, Action<object>>(); public TypeSwitch Case<TType>(Action<TType> act
public class TypeSwitch
{
readonly Dictionary<Type, Action<object>> matches = new Dictionary<Type, Action<object>>();
public TypeSwitch Case<TType>(Action<TType> action)
{
matches.Add(typeof(TType), type =>
{
try
{
action((TType)type);
}
catch (Exception ex)
{
Console.Write(ex); // invalid cast exception runtime type to other
}
});
return this;
}
public void Switch(Type type)
{
matches[type](type);
}
}
public ICommand PreviousStepCommand => new Command(p =>
{
Type activeWizardStep = this.WizardStepContext.GetType().UnderlyingSystemType;
TypeSwitch step =
new TypeSwitch()
.Case((RawEventDataFileStep type) =>
{
this.WizardStepContext = this.AddAdditionalInfoStepContext;
this.LabelFullTitle = $"{labelTitle}, {this.AddAdditionalInfoStepContext.StepTitle}";
})
.Case((RawEventDataAdditionalInfoStep type) => Logger.Warn("Next button in raw event data wizzard shold be disabled on last step"));
Logger.Info($"Switching from {activeWizardStep} to next step");
step.Switch(activeWizardStep);
});
所以基本上我被卡住了,我做错了什么?看起来你在传递一个
Type
这里:匹配[Type](Type)代码>当您可能应该传递其他内容时。毕竟,如果我们声明type=typeof(Bus)代码>然后我们有一个对象(类型
)描述总线
对象的外观。我们无法通过强制转换将该描述转换为实际的总线
(即(总线)类型;
不起作用)。@Llama同意-在某个地方,需要使用对象;我可能希望开关(objectobj)=>匹配[obj.GetType](obj)代码>操作:您打算转换什么,如何指定?似乎switched应该被定义为Marc建议的,或者可能被定义为公共无效开关(Type-Type,object-obj)
,或者没有什么可以转换的。我不想这么说,但是:难道不能用一个简单的开关
块或表达式来更方便、更有效地替换整个东西吗?或者甚至仅仅是多态性(如:avirtual
/abstract
方法)?@Llama是的,您是对的,在switch方法中,我应该获取对象而不是类型,当调用时,我正在传递现有的类实例。现在它起作用了,哦,瞎了我的眼睛。