C # ошибка приведения объекта к универсальному интерфейсу - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть следующий код.Я не могу привести объект ISearchProvider к другому интерфейсу, реализованному классом.

public interface IGenericSearchProcessor<T> where T: ISearchCriteria
{
    Task<ISearchResponse> Search(T criteria);
}

public class GibsonSearchProvider : IGenericSearchProcessor<ISearchCriteria>, IAggregateSearch, ISearchProvider
{

  public async Task<ISearchResponse> Search(ISearchCriteria criteria)
  {
    return new BasicSearchResponse
    {
        AggregateResults = aggregates
    };
  } 
}

public class GenericSearchStrategy<T> : ISearchStrategy<T> where T : ISearchCriteria
{
    public Task<ISearchResponse> Search(ISearchProvider provider, T criteria)
    {
        //exception here when try to cast.      
        var p = (IGenericSearchProcessor<T>)provider;


        //return ((IGenericSearchProcessor<T>)provider).Search(criteria);
    }
}

1 Ответ

0 голосов
/ 06 декабря 2018

Это приведение будет работать, только если:

  1. Объект, переданный в ваш метод Search, относится к типу, который реализует IGenericSearchProcessor<T> и,
  2. IGenericSearchProcessor<T> внедряет ISearchProvider.Ваш код показывает, что IGenericSearchProcessor<T> реализует ISearchCriteria, а не ISearchProvider.

Если вы просто собираетесь привести параметр к IGenericSearchProcessor<T>, то я бы предложил просто сделать этот типпараметр:

public Task<ISearchResponse> Search(IGenericSearchProcessor<T> provider, T criteria) {
    ...
}

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

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