C#:测试一个对象是否实现了接口列表中的任何一个

本文关键字:列表 任何一 接口 测试 一个对象 是否 实现 | 更新日期: 2023-09-27 18:29:32

我想测试一个类型是否实现了一组接口中的一个。

    ViewData["IsInTheSet"] =
            model.ImplementsAny<IInterface1, IInterface2, IInterface3, IInterface4>();

我已经编写了以下扩展方法来处理这个问题。

有没有一种更可扩展的方式来编写以下代码?我不希望在仍然利用泛型的情况下编写新方法。

    public static bool Implements<T>(this object obj)
    {
        Check.Argument.IsNotNull(obj, "obj");
        return (obj is T);
    }
    public static bool ImplementsAny<T>(this object obj)
    {
        return obj.Implements<T>();
    }
    public static bool ImplementsAny<T,V>(this object obj)
    {
        if (Implements<T>(obj))
            return true;
        if (Implements<V>(obj))
            return true;
        return false;
    }
    public static bool ImplementsAny<T,V,W>(this object obj)
    {
        if (Implements<T>(obj))
            return true;
        if (Implements<V>(obj))
            return true;
        if (Implements<W>(obj))
            return true;
        return false;
    }
    public static bool ImplementsAny<T, V, W, X>(this object obj)
    {
        if (Implements<T>(obj))
            return true;
        if (Implements<V>(obj))
            return true;
        if (Implements<W>(obj))
            return true;
        if (Implements<X>(obj))
            return true;
        return false;
    }

C#:测试一个对象是否实现了接口列表中的任何一个

为什么不使用以下内容:

public static bool ImplementsAny(this object obj, params Type[] types)
{
    foreach(var type in types)
    {
        if(type.IsAssignableFrom(obj.GetType())
            return true;
    }
    return false;
}

然后你可以这样称呼它:

model.ImplementsAny(typeof(IInterface1),
                    typeof(IInterface2),
                    typeof(IInterface3),
                    typeof(IInterface4));

检查接口是否已实现的方法是:

public static bool IsImplementationOf(this Type checkMe, Type forMe)
{
    if (forMe.IsGenericTypeDefinition)
        return checkMe.GetInterfaces().Select(i =>
        {
            if (i.IsGenericType)
                return i.GetGenericTypeDefinition();
            return i;
        }).Any(i => i == forMe);
    return forMe.IsAssignableFrom(checkMe);
}

这可以很容易地扩展到:

public static bool IsImplementationOf(this Type checkMe, params Type[] forUs)
{
    return forUs.Any(forMe =>
    {
        if (forMe.IsGenericTypeDefinition)
            return checkMe.GetInterfaces().Select(i =>
            {
                if (i.IsGenericType)
                    return i.GetGenericTypeDefinition();
                return i;
            }).Any(i => i == forMe);
        return forMe.IsAssignableFrom(checkMe);
    });
}

或者更好:

public static bool IsImplementationOf(this Type checkMe, params Type[] forUs)
{
    return forUs.Any(forMe => checkMe.IsImplementationOf(forMe));
}

警告:未测试

然后只需对类型参数执行typeof,然后再将它们传递给此。

相关文章: