2013-11-25 39 views
2

我有一个旨在创建一个窗口的实例,并返回我RelayCommand(基本上,它只是一个MVVMLite辅助方法的功能:传递XAML窗口类型的功能

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函数简单地接受窗口的类名?

回答

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>(); 
+0

有趣的是,我最近刚刚回答了一个类似于Windows Phone的静态类型导航:http://stackoverflow.com/questions/20004086/is-there-a -typesafe路 - 中 - 导航屏式窗口电话间#20063659分之20063659 –

0

您需要使用typeof来传递类型,否则您要传递一个类。 typeof抓住了System.Type,这正是你期望的,否则它正在寻找该类中的定义。你也可以使用.GetType()。

+0

如何在不使用'typeof()'或'.GetType()'的情况下传递'View.MyView'? –

+0

我真的不认为你可以。 http://msdn.microsoft.com/en-us/library/vstudio/58918ffs.aspx。您正在询问System.Type。如果您尝试传递View.MyView,则传入一个'type',但传入一个System.Type。 – Recursor

1

I'm passing a type and expecting a type.

你试图通过一个,但你不能在.net中做到这一点。您只能通过System.Type对象。 您可以通过编写typeof(MyClass)从课程中获得System.Type对象。 您可以通过编写obj.GetType()从对象中获得一个System.Type对象。

您需要了解/对象/实例之间的差异。

+0

我将分配赏金,因为这是最高的选票答案,但看到我的答案,因为这是可能的使用仿制药 –

+0

@ pm_2是的,你的答案是更好的。我没有完全理解你的语境> _ < –