确定对象是否为任何谓词<t> </t>

时间:2010-02-23 17:11:08

标签: c# .net reflection delegates types

我的IList<Delegate>包含一些Func<bool>和一些Predicate<T>,其中T不同。我后来需要弄清楚这些项目中的哪些是Predicate<T>,但是不想关闭以后将其他Delegate类型添加到列表的大门,所以我不想这样做通过!(current_delegate is Func<bool>)确定对象。

Predicate<T>以下的最高抽象是MulticastDelegate,这似乎无益(在Predicate下需要非通用的Predicate<T>类型),并确定通用的存在鉴于列表中可能存在的其他通用Delegate,参数也无用。

我考虑的另一件事是检查Name的{​​{1}}。对我来说,字符串比较是一种近乎嗅觉,但也许这是最好的和/或唯一的方式 - 你告诉我。

在不知道Type类型的情况下明确确定objectPredicate<T>的最佳方法是什么?

4 个答案:

答案 0 :(得分:8)

像这样:

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

答案 1 :(得分:2)

Predicate<int> pred = ...;
var isPreidcate = pred.GetType().GetGenericTypeDefinition() == typeof(Predicate<>);

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

答案 2 :(得分:0)

您可以拥有一个包含代理的特殊类列表,并提供其他排序信息。所以你会间接解决这个问题。

答案 3 :(得分:0)

这应该足够好了:

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