将接口类型作为参数传递

5

我已经知道可以将接口作为参数传递给方法。这样可以只指定方法所需的对象的相关成员。我想做的是能够将接口类型作为参数传递。

假设我声明了几个接口,并且这些接口在一系列对象上实现得不均匀,这些对象都形成一个单独的列表/集合。我是否可以编写一个帮助方法,它将同时接受来自列表的对象和一个接口类型作为参数,并检查对象是否实现了该接口?以下代码显然很糟糕,但它说明了我想要做的事情:

private bool CheckType(object o, interface intrfce)
{
    try
    {
        object x = (object)(intrfce)o;
        return true;
    }
    catch (InvalidCastException e) 
    {
        return false
    }
}

目前,我只是计划为接口设置一个枚举,并要求所有类公开实现的接口数组/列表。然后,我可以检查枚举列表以查看它们具有哪些相关接口(我只对我创建的接口感兴趣 - 我不需要返回 IEnumerableICloneable 等)。或者,我可以为每个接口编写帮助方法。我只是想知道是否有更优雅的方法来做到这一点?

2个回答

7

您可以使用泛型来实现:

private bool CheckType<T>(object o) {
    return o is T;
}

您可以这样调用它:
foreach (object o in myList) {
    if (CheckType<MyInterface>(o)) {
        ... // Do something
    }
}

考虑到条件语句很容易完成,您可以在条件语句中进行实现。

最后,如果您希望仅处理混合列表中实现特定接口的对象,则可以使用LINQ的OfType方法来实现,如下所示:

foreach (MyInterface o in myList.OfType<MyInterface>()) {
   ...
}

谢谢,正是我想要的! - Orphid

2

您可以这样做:

private bool CheckType(object o, params Type[] types)
{
    //you can optionally check, that types are interfaces
    //and throw exceptions if non-interface type was passed
    if(types.Any(type => !type.IsInterface))
        throw new Exception("Expected types to have only interface definitions");

    return types.All(type => type.IsAssignableFrom(o.GetType()));
}


CheckType(new List<int>(), typeof(IEnumerable), typeof(IList)); //returns true
CheckType(0, typeof(IEnumerable)); //return false

要检查一系列对象,您可以使用以下内容:

private bool CheckAllType(IEnumerable<object> items, params Type[] types)
{
    return items.All(item => CheckType(item, types));
}

这非常有用。我喜欢能够将多个接口类型作为参数传递的能力。谢谢! - Orphid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接