如果<t>是动态的,那么如何测试Enumerable <t>中的<t>是否实现了接口?</t> </t> </t>

时间:2014-01-25 23:42:07

标签: c# generics interface ienumerable

我有一个接受IEnumerable<dynamic>

的方法

有没有办法测试方法中的动态类型,看它是否实现了特定的接口?

我的意图是这样的:

public void myMethod(IEnumerable<dynamicT> enumerable)
{
    if (dynamicT is IInterface)
    {
        // do one thing
    }
    else if (dynamicT is IAnotherInterface)
    {
        // do another thing
    }
}

更新

我应该包含这个重要事实:<T>是动态的。

请原谅,我正在接近午夜,我正在编码。 : - $

3 个答案:

答案 0 :(得分:5)

您可以使用Type.IsAssignableFrom方法:

  

确定是否可以从指定Type的实例分配当前Type的实例。

public void myMethod(IEnumerable<T> enumerable)
{
    if (typeof(IInterface).IsAssignableFrom(typeof(T))
    {
        // do one thing
    }
    else if (typeof(IAnotherInterface).IsAssignableFrom(typeof(T))
    {
        // do another thing
    }
}

答案 1 :(得分:3)

is关键字用于 对象 ,而 反射

您可以使用typeof(T).GetInterfaces()来提取应用于特定类型的所有接口。

public void MyMethod(IEnumerable<T> enumerable)
{
    var typeInterfaces = typeof(T).GetInterfaces();

    if (typeInterfaces.Contains(typeof(IInterface))) {
        // Something
    }
    else if(typeInterfaces.Contains(typeof(IAnotherInterface))) {
        // Something Else
    }
}

============根据评论更新============

如果T 动态 ,您无法从Type本身获取您正在寻找的信息,因为T可能代表任意数量的 不同类型 所有这些都在同一时间。

然而,您可以遍历每个元素并使用is关键字测试对象本身。

public static void MyMethod<T>(IEnumerable<T> enumerable)
{
    foreach (var dynObj in enumerable)
    {
        var typeInterfaces = dynObj.GetType().GetInterfaces();

        if (typeInterfaces.Contains(typeof(IInterface))) {
            // Something
        }
        else if(typeInterfaces.Contains(typeof(IAnotherInterface))) {
            // Something Else
        }
    }
}

或者,如果您只想测试可枚举中的所有可能接口,则可以执行此操作:

public static void MyMethod<T>(IEnumerable<T> enumerable)
{
    var allInterfaces = enumerable.SelectMany(e => e.GetType().GetInterfaces()).ToList();

    if (allInterfaces.Contains(typeof(ITheFirstInterface)))
    {
        Console.WriteLine("Has The First Interface");
    }

    if (allInterfaces.Contains(typeof(ITheSecondInterface)))
    {
        Console.WriteLine("Has The Second Interface");
    }
}

答案 2 :(得分:1)

请尝试以下方法。由于T是动态的,因此您需要查看列表中的第一项以找出其类型。

public void myMethod<T>(IEnumerable<T> enumerable)
{
    dynamic peek = enumerable.FirstOrDefault();
    Type dtype = peek.GetType();

    if (typeof(IInterface).IsAssignableFrom(dtype))
    {
        // do one thing
    }
    else if (typeof(IAnotherInterface).IsAssignableFrom(dtype))
    {
        // do another thing
    }
}