Неявное приведение в действие - PullRequest
2 голосов
/ 09 мая 2011

Я использую сторонний класс библиотеки, который имеет следующий (сокращенный) метод:

public void DoSomethingAsync(Action<ResultInfo> callback)

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

public void MyDoSomethingAsync(Action<MyResultInfo> callback)
{
    this.wrappedClass.DoSomethingAsync(callback);
}

Проблема в том, что мне нужно преобразовать параметр callback из Action<MyResultInfo> в Action<ResultInfo>,Возможно ли это с помощью специального неявного оператора приведения или есть альтернативный подход, который кто-то может порекомендовать?

Ответы [ 2 ]

1 голос
/ 09 мая 2011

Нет, вы не сможете сделать это напрямую, даже если MyResultInfo получено из ResultInfo; делегатная противоположность не будет применяться здесь, поскольку Action<MyResultInfo> не сможет обработать любой экземпляр, полученный из ResultInfo (так что дисквалифицируется Action<MyResultInfo> из-за использования вместо Action<ResultInfo>)

Однако это не означает, что вы не можете использовать адаптер, например:

public void MyDoSomethingAsync(Action<MyResultInfo> callback)
{
    // Create the action which will transform ResultInfo
    // into MyResultInfo and then pass to the wrapped
    // class.
    // Create the action first.
    Action<ResultInfo> a = ri => {
        // Translate ri into MyResultInfo.
        MyResultInfo mri = (translate here);

        // Call the callback with the translated result.
        callback(mri);
    };

    // Pass the action to the wrapped class.
    this.wrappedClass.DoSomethingAsync(a);
}
0 голосов
/ 09 мая 2011

Проблема в том, что то, что вы хотите сделать, может привести к несогласованности. Я предполагаю, что MyResultInfo является производным от ResultInfo, потому что в противном случае это не имеет никакого смысла.

Теперь вернемся к несоответствию. Представьте, что у вас есть делегат Action<ResultInfo> callback. Код вызова может назвать его так: callback(new MyResultInfo()); и позвоните вашему Action<MyResultInfo>, и он будет работать нормально. Но представьте, что это называется так: callback(new ResultInfo());, Action<ResultInfo> позволяет, но это приведет к исключению, потому что ResultInfo нельзя привести к MyResultInfo.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...