我想按类型分隔IEnumerable
个变量。我的代码是这样的:
if (type is IEnumerable)
{
var listGenericType = type.GetType().GetGenericTypeDefinition().Name;
listGenericType = listGenericType.Substring(0, listGenericType.IndexOf('`'));
if (listGenericType == "List") {
//do something
}
else if (listGenericType == "HashSet") {
//do something
}
}
当我使用type.GetType().GetGenericTypeDefinition().Name
时,listGenericType
就像List`1
或HashSet`1
,但我希望它像List
或HashSet
。因此,我使用Substring
来处理这个问题!
无论如何在没有postProcessing string
类型的情况下处理此问题?我的意思是下面的代码:
if (type is IEnumerable)
{
var listGenericType = type.GetType().GetGenericTypeDefinitionWithoutAnyNeedForPostProcessing();
if (listGenericType == "List") {
//do something
}
else if (listGenericType == "HashSet") {
//do something
}
}
答案 0 :(得分:5)
您不必将其与字符串进行比较。由于GetGenericTypeDefinition()
会返回类型,您只需将其与使用typeof
运算符的类型进行比较,如下所示:
if (type is IEnumerable)
{
var listGenericType = type.GetType().GetGenericTypeDefinition();
if (listGenericType == typeof(List<>)) {
//do something
}
else if (listGenericType == typeof(HashShet<>)) {
//do something
}
}
正如@nopeflow在下面明确指出的那样,如果您的类型不是泛型类型,那么GetGenericTypeDefinition()
将抛出InvalidOperationException
。请务必考虑到这一点。
答案 1 :(得分:0)
假设您只是在寻找通用类型,我相信这可能会帮助您。
List<int> someObject = new List<int>();
Type currentType = someObject.GetType();
if (currentType.IsGenericType)
{
if (currentType.GetGenericTypeDefinition() == typeof(List<>))
{
// Do something
}
else if (currentType.GetGenericTypeDefinition() == typeof(HashSet<>))
{
// Do something else
}
}