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>
因为你给了编译器足够的信息,以便它可以验证转换实际上是安全的
归档时间: |
|
查看次数: |
157 次 |
最近记录: |