你能否在这段代码中澄清为什么:
private Dictionary<Type, Type> viewTypeMap = new Dictionary<Type, Type>();
public void ShowView<TView>(ViewModelBase viewModel, bool showDialog = false)
where TView : IView
{
var view = Activator.CreateInstance(viewTypeMap[typeof(TView)]);
(IView)view.ShowDialog();
}
我收到错误:
“只有赋值,调用,递增,递减和新对象 表达式可以用作语句。“
IView定义了ShowDialog()方法。
答案 0 :(得分:12)
强制转换运算符的优先级低于成员访问运算符。
(A)B.C();
被解析为
(A)(B.C());
这不是法律声明。你应该写
((A)B).C();
如果您要将B
转换为A
,然后在C()
类型上致电A
。
为了将来参考,优先级表在这里:
http://msdn.microsoft.com/en-us/library/aa691323(v=VS.71).aspx
答案 1 :(得分:2)
为什么不尝试以下操作,以便将您的视图对象声明为IView而不是对象?
public void ShowView<TView>(ViewModelBase viewModel, bool showDialog = false) where TView : IView
{
var view = (IView)Activator.CreateInstance(viewTypeMap[typeof(TView)]);
view.ShowDialog();
}
答案 2 :(得分:0)
您可以在实例化时将其强制转换,然后如果多次使用它,则不需要每次都重新创建它。
var view = (IView)Activator.CreateInstance(viewTypeMap[typeof(TView)]);
view.ShowDialog();
答案 3 :(得分:-1)
更改
(IView)view.ShowDialog();
到
((IView) view).ShowDialog();
Eric解释了为什么