我的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
类型的情况下明确确定object
是Predicate<T>
的最佳方法是什么?
答案 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