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.我如何检查是否res是SearchResult<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>因为你给了编译器足够的信息,以便它可以验证转换实际上是安全的