我有一个用于创建窗口实例的函数,并返回RelayCommand
(基本上,它只是一个MVVMLite辅助方法:
public static RelayCommand NavigateTo(Type navigateTo)
{
var relayCmd = new RelayCommand (() => Navigate(navigateTo));
return relayCmd;
}
private static void Navigate(Type navigateTo)
{
var newWin = Activator.CreateInstance(navigateTo);
((Window)newWin).Show();
}
然后我在一个单独的类中调用它:
this.MyCommand = Navigation.NavigateTo(View.MyView);
MyView是一个有效的窗口,但是,我得到以下编译错误:
The best overloaded method match for 'MyProject.Navigation.NavigateTo(System.Type)' has some invalid arguments
我可以通过这样做来实现它:
this.MyCommand = Navigation.NavigateTo(typeof(View.MyView));
我的问题是:为什么?我正在传递一种类型并期待一种类型。另外,有没有办法让我的NavigateTo
函数能够简单地接受Window的类名?
答案 0 :(得分:1)
我正在传递一个类型并期待一个类型。
您尝试传递类型,但无法在.Net中执行此操作。您只能传递System.Type
对象。
您可以通过编写System.Type
从课程中获取typeof(MyClass)
个对象。
您可以通过编写System.Type
来从对象获取obj.GetType()
对象。
您需要了解类 / 类型和对象 / 实例之间的区别。
答案 1 :(得分:1)
事实证明,我想要的是使用泛型,它允许我传递类类型并在函数中处理它:
public static RelayCommand NavigateTo<T>()
{
Type dest = typeof(T);
var relayCmd = new RelayCommand(() => Navigate(dest));
return relayCmd;
}
private static void Navigate<T>()
{
object dest = Activator.CreateInstance<T>();
((Window)dest).Show();
}
并且这样打电话:
this.MyCommand = Navigation.NavigateTo<MyView>();
答案 2 :(得分:0)
您需要使用typeof传递类型,否则您传递的是类。 typeof抓取System.Type,这是你期望的,否则它正在寻找该类中的定义。您也可以使用.GetType()。