将XAML窗口类型传递给函数

时间:2013-11-25 16:36:55

标签: c# types

我有一个用于创建窗口实例的函数,并返回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的类名?

3 个答案:

答案 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()。