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

C# 检查类的泛型参数是否实现接口,c#,generics,interface,casting,C#,Generics,Interface,Casting,我有以下通用类: public class SearchResult<T> { public int ResultCount { get; set; } public IEnumerable<T> Result { get; set; } } 我还有一个类型为object的变量res。 如何检查res是否为搜索结果 我试着这样做: if (res.GetType().IsAssignableFrom(typeof(SearchResult<IFly

我有以下通用类:

public class SearchResult<T>
{
    public int ResultCount { get; set; }
    public IEnumerable<T> Result { get; set; }
}
我还有一个类型为
object
的变量
res
。 如何检查
res
是否为
搜索结果

我试着这样做:

if (res.GetType().IsAssignableFrom(typeof(SearchResult<IFlyable>)))
{
    ///
}
if(res is SearchResult<IFlyable>)
{
    ///
}
if(res.GetType().IsAssignableFrom(typeof(SearchResult)))
{
///
}
这样:

if (res.GetType().IsAssignableFrom(typeof(SearchResult<IFlyable>)))
{
    ///
}
if(res is SearchResult<IFlyable>)
{
    ///
}
if(res是SearchResult)
{
///
}

但是它似乎不起作用。

您遇到的问题可能是由于
SearchResult
无法转换为
SearchResult
,因为
SearchResult
T
中是不变的

C#只承认接口和委托中的泛型类型差异。您需要定义一个在泛型类型中是协变的
ISearchResult
接口

在您的情况下,如果可以接受
T
仅用作输出,您可以定义如下接口:

public interface ISearchResult<out T>
{
     int ResultCount { get; }
     IEnumerable<T> Result { get; }
}
公共接口ISearchResult
{
int ResultCount{get;}
IEnumerable结果{get;}
}

现在一个
ISearchResult
就是一个
ISearchResult
,因为您已经给了编译器足够的信息,这样它就可以验证转换实际上是安全的

您也可以使用反射来尝试,反射也可以工作,无需创建另一个接口

static void Main()
{
    var sr = new SearchResult<Bird>();
    Console.WriteLine(IsSearchResultIFlyable(sr.GetType())
        ? "sr is SearchResult<IFlyable>"
        : "sr is Not SearchResult<IFlyable>");

    Console.ReadLine();
}

public static bool IsSearchResultIFlyable(Type t)
{
    if (!t.IsGenericType) return false;
    if (t.GetGenericTypeDefinition() != typeof(SearchResult<>)) return false;

    var gr = t.GetGenericArguments();
    return gr.Length == 1 && typeof(IFlyable).IsAssignableFrom(gr[0]);
}
static void Main()
{
var sr=新的搜索结果();
Console.WriteLine(IsSearchResultifyable(sr.GetType())
?“sr是搜索结果”
:“sr不是搜索结果”);
Console.ReadLine();
}
公共静态布尔值是可读取的(t型)
{
如果(!t.IsGenericType)返回false;
如果(t.GetGenericTypeDefinition()!=typeof(SearchResult))返回false;
var gr=t.GetGenericArguments();
返回gr.Length==1&&typeof(IFlyable).IsAssignableFrom(gr[0]);
}

@maccettura res是一个
对象
并且没有
结果
属性。@mjwills我想检查特定的
对象
是否是
搜索结果
的实际具体类型是什么?它是
object res=new SearchResult()
还是实际上是
object res=new SearchResult()
。另外,如果在使用泛型时必须进行类型检查,则很可能是您做出了错误的设计决策,因此,解释您为什么要这样做可能会让我们建议另一种方法。@juharr
object res=new SearchResult()
我的解释非常好(+1)。要用不太专业的术语重申InBetween的答案:假设不需要
out
。然后C将允许您将
IList
转换为
IList
,这将允许您将
飞机
添加到
IList