【问题标题】:C# error casting an object to a generic interfaceC# 将对象转换为泛型接口时出错
【发布时间】:2018-12-06 14:31:45
【问题描述】:

我有以下代码。我无法将 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);
    }
}

【问题讨论】:

  • 请提供minimal reproducible example。如果转换失败,那么大概提供者没有实际上实现你要转换到的接口...
  • 它正在实施。我已经编辑了代码
  • 如果你想要一个IGenericSearchProcessor&lt;T&gt;,那么你应该接受它作为你的参数,而不是你希望也实现该接口的ISearchProvider
  • 您仍然没有提供minimal reproducible example。我们看不到你用什么称呼Search。恐怕无法重现该问题,我仍然认为您的代码比运行时更有可能存在问题。我建议你在强制转换之前使用调试器中断,并详细检查 Tprovider 是什么。
  • GibsonSearchProvider 类实现了 IGenericSearchProcessor。我的问题是这个提供者是否可以被强制转换为这个通用接口,因为它已经实现了它?

标签: c# oop interface casting


【解决方案1】:

只有在以下情况下该演员才会起作用:

  1. 传递给Search 方法的对象属于实现IGenericSearchProcessor&lt;T&gt; 的类型,并且,
  2. IGenericSearchProcessor&lt;T&gt; 实现 ISearchProvider。您的代码显示 IGenericSearchProcessor&lt;T&gt; 实现了 ISearchCriteria,而不是 ISearchProvider

如果您只是要将参数转换为IGenericSearchProcessor&lt;T&gt;,那么我建议将其设置为参数的类型:

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

这样做可能会显示您的其他代码可能出错的地方。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-08
    • 2019-09-16
    • 2019-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多