2011-06-09 70 views
2

这并没有做任何事情,但导致需要什么,否则将是不必要的铸造(或者说,让我拉下代码库,并自己做出改变)。是否有这样做的理由?为什么RelayCommand <T> .Execute取一个对象而不是T?

参考文献:

Source on Codeplex

Blog posting with source

编辑 下面是一个例子:

DoCommand = new RelayCommand<AsyncCallback>((callBack) => 
{ 
    Console.WriteLine("In the Action<AsyncCallback>"); 
    SomeAsyncFunction((async_result) => 
    { 
     Console.WriteLine("In the AsyncCallback"); 
     callBack.Invoke(new MyAsyncResult(true)); 
    }); 
}); 

DoCommand.Execute((iasyncresult) => Console.WriteLine(iasyncresult.IsCompleted)); 
//Where MyAsyncResult is a class implement IAsyncResult that sets IsCompleted in the constructor 
// This will cause the "cannot cast lambda as object" error 

回答

1

您的错误是由于lambda不能作为object传递。相反,尝试:

AsyncCallback callback = (iasyncresult) => Console.WriteLine(iasyncresult.IsCompleted); 
DoCommand.Execute(callback); 
+0

这的确行得通,并且类似于仅投射AsyncCallback,但我发现匿名la​​mbda更具可读性。为什么这不是惯用的?我们嵌套回调,因为我们必须等待服务器响应,并向父视图指出其弹出窗口中的某个弹出窗口已完成它启动的异步操作。 – 2011-06-09 18:37:10

+1

@bearcdp:我开着你的lambda作为'ICommand'的参数。如果它没有被连接成XAML的一部分,为什么要使用'ICommand'? – user7116 2011-06-09 18:40:20

+0

它与XAML连接起来,只是认为将其呈现为玩具示例的纯C#是最简单的。它是通过按下按钮触发的,但是ICommand需要启动一些异步操作并在完成后执行一些其他操作。 – 2011-06-09 18:55:48

6

因为ICommand是不通用的。必须从接口进行强制类型转换,处理无效转换,并将转换实例转发到泛型方法。

相关问题