我需要验证一个对象以查看它是否为null,值类型,或IEnumerable<T>
其中T
是值类型。到目前为止,我有:
if ((obj == null) ||
(obj .GetType().IsValueType))
{
valid = true;
}
else if (obj.GetType().IsSubclassOf(typeof(IEnumerable<>)))
{
// TODO: check whether the generic parameter is a value type.
}
所以我发现对象为空,值类型,或某些IEnumerable<T>
的{{1}};如何检查T
是否为值类型?
答案 0 :(得分:12)
(编辑 - 添加值类型位)
您需要检查它实现的所有接口(请注意,理论上可以为多个IEnumerable<T>
实现T
):
foreach (Type interfaceType in obj.GetType().GetInterfaces())
{
if (interfaceType.IsGenericType
&& interfaceType.GetGenericTypeDefinition() == typeof(IEnumerable<>))
{
Type itemType = interfaceType.GetGenericArguments()[0];
if(!itemType.IsValueType) continue;
Console.WriteLine("IEnumerable-of-" + itemType.FullName);
}
}
答案 1 :(得分:0)
你能用GetGenericArguments
做点什么吗?
答案 2 :(得分:0)
我的通用贡献,检查给定类型(或其基类)是否实现了类型为T的接口:
public static bool ImplementsInterface(this Type type, Type interfaceType)
{
while (type != null && type != typeof(object))
{
if (type.GetInterfaces().Any(@interface =>
@interface.IsGenericType
&& @interface.GetGenericTypeDefinition() == interfaceType))
{
return true;
}
type = type.BaseType;
}
return false;
}