检查类的泛型参数是否实现接口

kor*_*inp 3 c# generics casting interface

我有一个以下泛型类:

public class SearchResult<T>
{
    public int ResultCount { get; set; }
    public IEnumerable<T> Result { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我也有一个Bird实现IFlyble接口的类:

public class Bird : IFlyable
{
    public void Fly() {}
}

public interface IFlyable
{
    void Fly();
}
Run Code Online (Sandbox Code Playgroud)

我也有一个res类型的变量object.我如何检查是否resSearchResult<IFlyable>

我这样试试:

if (res.GetType().IsAssignableFrom(typeof(SearchResult<IFlyable>)))
{
    ///
}
Run Code Online (Sandbox Code Playgroud)

这样:

if(res is SearchResult<IFlyable>)
{
    ///
}
Run Code Online (Sandbox Code Playgroud)

但它似乎不起作用.

InB*_*een 15

您遇到的问题可能是由于这样的事实,SearchResult<Bird>不能转换SearchResult<IFlyable>因为SearchResult<T>是不变的T.

C#只允许接口和委托中的泛型类型差异.您需要ISearchResult<>在其泛型类型中定义一个协变的接口.

在您的情况下,如果可接受的T是仅用作输出,您可以按如下方式定义此类接口:

public interface ISearchResult<out T>
{
     int ResultCount { get; }
     IEnumerable<T> Result { get; }
}
Run Code Online (Sandbox Code Playgroud)

现在a ISearchResult<Bird>ISearchResult<IFlyable>因为你给了编译器足够的信息,以便它可以验证转换实际上是安全的