【问题标题】:Determine if object is any Predicate<T>确定对象是否为任何 Predicate<T>
【发布时间】:2011-01-20 04:19:28
【问题描述】:

我有一个IList&lt;Delegate&gt;,其中包含一些Func&lt;bool&gt;s 和一些Predicate&lt;T&gt;s,其中T 各不相同。稍后我需要整理出这些项目中的哪些是Predicate&lt;T&gt;s,但不想关闭稍后将其他Delegate类型添加到列表中的大门,所以我不想通过@识别对象来做到这一点987654327@.

Predicate&lt;T&gt; 下面的最高抽象是MulticastDelegate,这似乎没什么用(在Predicate&lt;T&gt; 下需要一个非泛型的Predicate 类型),并且鉴于其他泛型,识别泛型参数的存在也是无用的Delegates 可能出现在列表中。

我唯一考虑的另一件事是检查TypeName。对我来说,字符串比较几乎是一种味道,但也许这是最好的和/或唯一的方法——你告诉我。

在不知道T 的类型的情况下确定object 是任何Predicate&lt;T&gt; 的最佳方法是什么?

【问题讨论】:

    标签: c# .net reflection delegates types


    【解决方案1】:

    您可以拥有一个特殊类的列表,这些类可以包装您的委托并提供额外的排序信息。这样你就可以间接解决问题了。

    【讨论】:

    • 谢谢;该列表是通过传递 lambda 表达式来填充的,这会大大增加实现的复杂性。
    【解决方案2】:
    Predicate<int> pred = ...;
    var isPreidcate = pred.GetType().GetGenericTypeDefinition() == typeof(Predicate<>);
    

    另一方面,如果您有一个通用列表,则不需要检查其中的类型。如果您需要检查列表中的特定类型,您可能需要重新考虑您的设计。

    【讨论】:

      【解决方案3】:

      像这样:

      obj.GetType().GetGenericTypeDefinition() == typeof(Predicate<>)
      

      【讨论】:

      • 完美。我现在可能至少每周都会找到一个很好的用途。
      • 是的,但要准备好捕捉将针对非泛型委托类型抛出的InvalidOperationException——这听起来可能是未来的可能性。为避免麻烦,请在调用此方法之前检查Type.IsGenericType
      【解决方案4】:

      这应该足够好:

      public static bool IsPredicate(object obj) {
          var ty = obj.GetType();
          var invoke = ty.GetMethod("Invoke");
          return invoke != null && invoke.ReturnType == typeof(bool);
      }
      

      诀窍是当你真正想要调用函数时,你需要使用反射。

      这里有一些测试:

      Func<bool> is pred? True
      Func<int, bool> is pred? True
      Predicate<int> is pred? True
      Func<int> is pred? False 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-16
        • 1970-01-01
        • 1970-01-01
        • 2011-12-12
        • 2020-08-31
        • 2012-02-13
        • 1970-01-01
        • 2010-10-18
        相关资源
        最近更新 更多