Почему RelayCommand <T>.Execute принимает объект вместо T? - PullRequest
2 голосов
/ 09 июня 2011

Это ничего не сделало, но вызвало необходимость того, что в противном случае было бы ненужным приведением (или, скорее, заставило меня сбросить кодовую базу и внести изменения самостоятельно).Есть ли причина для этого?

Ссылки:

Источник на Codeplex

Публикация в блоге с источником

Редактировать Вот пример:

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

Ответы [ 2 ]

6 голосов
/ 09 июня 2011

Потому что ICommand не является универсальным.Универсальная реализация ICommand должна приводить из интерфейса, обрабатывать недопустимые приведения и пересылать экземпляр приведения к универсальным методам.

1 голос
/ 09 июня 2011

Ваша ошибка связана с тем, что лямбда не может быть передана как object.Вместо этого попробуйте:

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