如何访问通用定义对象的属性?

时间:2018-06-26 21:08:00

标签: c# mvvm

我有以下代码。 (旨在从代码中打开视图模型)。

private void OpenView<viewType,viewModelType> (object parameters) {

        //STEP 1. CREATE THE VIEW
        var view = (viewType)Activator.CreateInstance(typeof(viewType));            

        //STEP 2. SET THE DATACONTEXT
        var viewModel = (viewModelType)view.DataContext;            

        //STEP 3. OPEN THE WINDOW AND WAIT UNTIL MANUALLY CLOSED            
        TestWindow window = new TestWindow();
        window.LayoutRoot.Children.Add(view);
        window.Activate();
        window.ShowDialog();            
    }

编译器给我以下错误;

  

错误CS1061'viewType'不包含针对的定义   “ DataContext”并且没有扩展方法“ DataContext”接受第一个   可以找到类型'viewType'的参数(您是否缺少   指令还是程序集引用?)

我无法在步骤2中访问DataContext,因为我认为编译器不知道视图变量是什么类型。谁能告诉我如何告诉编译器视图变量是什么类型?如果不可能的话。如何解决呢?

1 个答案:

答案 0 :(得分:2)

这里有两个实际的解决方案。

  1. viewType始终是同一类型:所以请不要使其通用。
  2. viewType始终从相同的基类继承或实现公共接口。例如,它始终是具有FrameworkElement属性的DataContext。在这种情况下,您可以将泛型类型限制为该类:

    private void OpenView<TViewType, TViewModelType>(object parameters)
        where viewType : FrameworkElement // This is the magic sauce
    {
        var view = (TViewType)Activator.CreateInstance(typeof(TViewType));            
    
        // Now we can access the DataContext
        var viewModel = (TViewModelType)view.DataContext;  
    
        //snip
    }
    

PS这是很普遍的做法,在通用类型前面加上T