有没有一种方便的方法来判断一个Object是否实现了

本文关键字:一个 Object 实现 判断 是否 方法 一种 方便 有没有 | 更新日期: 2023-09-27 17:58:35

我正试图弄清楚.NET框架中是否有任何内置例程或类可以提供一种方便的方法来测试集合是否在以下接口中实现,从而挂钩到相关事件(如果有的话):

  • IEnumerable
  • IList
  • ICollection
  • IBindingList
  • IEnumerable <T>
  • IList <T>
  • ICollection <T>
  • IRaiseItemChangedEvents
  • INotifyCollectionChanged

主要用于数据绑定目的。。。

我可以进行很多反思(例如IsAssignableFrom),但由于这似乎是一种非常常见的场景,我想知道在这方面是否已经做了什么。

[编辑]
我的问题似乎太含糊或措辞不当,我的错。正如我稍后在一条评论中指出的那样,我更想寻找一种提供集中式数据绑定的方法,可能有兴趣使UI不可知,似乎MS在内部提供了一些工具,例如:http://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/DataGridViewDataConnection.cs,68950bc360ed4e45,参考文献但没有什么是公开的。

现在,我的方法是用一种等价的BindingSource来封装所有内容,并检查传递给构造函数的对象是否实现了我愿意连接的任何接口。

有没有一种方便的方法来判断一个Object是否实现了

除了上一个答案的is运算符外,您还可以使用as运算符:

var IEnumerable myIEnumerableObject = unknownObject as IEnumerable;
if(myIEnumerableObject != null)
{
    myIEnumerableObject.SomeEvent += SomeEventHandler;
}

正如@aquinas所提到的,您可以使用.Net is关键字来检查对象的实例是否实现了指定的接口。

示例:

if (unknownObject is IEnumerable)
{
    foreach (var obj in uknownObject)
    {
        Console.WriteLine(obj.ToString());
    }
}

您可以检查集合中的特定接口,例如

if(CurrentCollection.GetType().GetInterface("IInterfaceName")!=null)
{
   // Implements interface IInterfaceName
}

我想你应该创建自己的扩展方法:

public static class CustomCollectionExtension
{
    public static bool AddEvent(this IList myList, EventHandler e)
    {
        // Do Some Stuff
        return true;
    }
    public static bool AddEvent(this ICollection myCollection, EventHandler e)
    {
        // Do Some Stuff
        return true;
    }
    // And so on...
}

然后,在你的应用程序中,它将很容易使用,而不需要知道你的收藏类型,比如:

dataContainer.AddEvent(evt);