我到目前为止的代码如下,我要解决的是摆脱try-catch:
public static bool IsNeverValidGenericArgument(this Type type) {
var elementType=type.GetElementType();
if(null!=elementType) {
if(type.IsArray)
try {
typeof(IList<>).MakeGenericType(elementType);
return false;
}
catch(ArgumentException) {
}
catch(TypeLoadException) {
}
return true; // pointer or byref
}
return
typeof(void)==type||typeof(RuntimeArgumentHandle)==type
||
typeof(ArgIterator)==type||typeof(TypedReference)==type;
}
我正在尝试编写动态类型构造的代码,我的代码将GetInterfaces()
在传递的每种类型上调用,但是消费者代码传递的某些类型可能会在内部导致一个TypeLoadException
in RuntimeType
(例如typeof(ArgIterator).MakeArrayType().MakeArrayType()
在 3.5 中,但不是 4.0+),我首先需要检查它是否永远不是有效的通用参数。try-catch 有效,但没有用。
请注意,它抛出的情况可能会因 .Net framework 的不同版本而异。
编辑:
该方法的另一个版本是:
public static bool IsNeverValidGenericArgument(this Type type) {
var elementType=type.GetElementType();
if(null!=elementType) {
if(type.IsArray)
return elementType.IsNeverValidGenericArgument();
return true; // pointer or byref
}
return
typeof(void)==type||typeof(RuntimeArgumentHandle)==type
||
typeof(ArgIterator)==type||typeof(TypedReference)==type;
}
但这会将某些类型报告为无效,实际上不会导致异常RuntimeType
,例如typeof(ArgIterator).MakeArrayType(2).MakeArrayType()
.
我知道有些类型通常不会使用,但我无法避免它们在消费者代码中使用。