除了这种方法,是否有更好的方法来确定类型是否是Action<>委托之一。
if(obj is MulticastDelegate && obj.GetType().FullName.StartsWith("System.Action"))
{
...
}
这看起来非常简单。
static bool IsAction(Type type)
{
if (type == typeof(System.Action)) return true;
Type generic = null;
if (type.IsGenericTypeDefinition) generic = type;
else if (type.IsGenericType) generic = type.GetGenericTypeDefinition();
if (generic == null) return false;
if (generic == typeof(System.Action<>)) return true;
if (generic == typeof(System.Action<,>)) return true;
... and so on ...
return false;
}
我很好奇你为什么想知道这个。如果某个类型恰好是Action的版本之一,你为什么在意呢?你打算用这些信息做什么?
type.BaseType == typeof(MulticastDelegate)
是否足够? - AshleyF private static readonly HashSet<Type> _set = new HashSet<Type>
{
typeof(Action), typeof(Action<>), typeof(Action<,>), // etc
typeof(Func<>), typeof(Func<,>), typeof(Func<,,>), // etc
};
// ...
Type t = type.GetType();
if (_set.Contains(t) ||
(t.IsGenericType && _set.Contains(t.GetGenericTypeDefinition())))
{
// yep, it's one of the action or func delegates
}