我在当前的项目中进行了大量的反思,并且我试图提供一些辅助方法以保持一切整洁。
我想提供一对方法来确定类型或实例是否实现
IEnumerable
– 无论类型T
如何。这是我现在所拥有的:
public static bool IsEnumerable(this Type type)
{
return (type is IEnumerable);
}
public static bool IsEnumerable(this object obj)
{
return (obj as IEnumerable != null);
}
当我使用
测试它们时Debug.WriteLine("Type IEnumerable: " + typeof(IEnumerable).IsEnumerable());
Debug.WriteLine("Type IEnumerable<>: " + typeof(IEnumerable<string>).IsEnumerable());
Debug.WriteLine("Type List: " + typeof(List<string>).IsEnumerable());
Debug.WriteLine("Type string: " + typeof(string).IsEnumerable());
Debug.WriteLine("Type DateTime: " + typeof(DateTime).IsEnumerable());
Debug.WriteLine("Instance List: " + new List<string>().IsEnumerable());
Debug.WriteLine("Instance string: " + "".IsEnumerable());
Debug.WriteLine("Instance DateTime: " + new DateTime().IsEnumerable());
我得到的结果是:
Type IEnumerable: False
Type IEnumerable<>: False
Type List: False
Type string: False
Type DateTime: False
Instance List: True
Instance string: True
Instance DateTime: False
type 方法似乎根本不起作用 – 我原本期望至少有一个
true
来直接匹配 System.Collections.IEnumerable
。
我知道
string
在技术上是可枚举的,尽管有一些注意事项。然而,理想情况下,在这种情况下,我需要辅助方法来返回 false
。我只需要具有定义的 IEnumerable<T>
类型的实例即可返回 true
。
我可能只是错过了一些相当明显的东西 - 谁能指出我正确的方向?
以下行
return (type is IEnumerable);
询问“如果
Type
的实例,type
是 IEnumerable
”,显然不是。
你想做的是:
return typeof(IEnumerable).IsAssignableFrom(type);
要检查某种类型是否实现 IEnumerable 无论 T 是什么,都需要检查 GenericTypeDefinition。
public static bool IsIEnumerableOfT(this Type type)
{
return type.GetInterfaces()
.Append(type) // ensure this type is also checked
.Any(x => x.IsGenericType
&& x.GetGenericTypeDefinition() == typeof(IEnumerable<>));
}
Type.IsAssignableFrom(Type)
之外,你还可以使用Type.GetInterfaces()
:
public static bool ImplementsInterface(this Type type, Type interfaceType)
{
// Deal with the edge case
if ( type == interfaceType)
return true;
bool implemented = type.GetInterfaces().Contains(interfaceType);
return implemented;
}
这样,如果您想检查多个接口,您可以轻松修改
ImplementsInterface
以获取多个接口。