.NETreflection – 如何从ParameterInfo中获取“真实”类型

我正在尝试validation参数是否为out参数并扩展接口(ICollection)。 reflectionapi似乎不想给我参数的“真实”类型,只有最后一个“&”的参数不能在IsAssignableFrom语句中正确评估。 我写了一些有效的c#代码,但似乎应该有更好的方法来做到这一点。

bool isCachedArg(ParameterInfo pInfo) { if (!pInfo.IsOut) return false; string typeName = pInfo.ParameterType.FullName; string nameNoAmpersand = typeName.Substring(0, typeName.Length - 1); Type realType = Type.GetType(nameNoAmpersand); if (!typeof(ICollection).IsAssignableFrom(realType)) return false; return true; } 

有没有办法获得realType而无需从其字符串名称重新加载Type? 我还在使用.NET 2.1。

谢谢,兰迪

out参数是“by ref” – 所以你会发现pInfo.ParameterType.IsByRef返回true。 要获取基础not-by-ref类型,请调用GetElementType()

 Type realType = pInfo.ParameterType.GetElementType(); 

(当然,如果 ref,那么你应该这样做。这也适用于ref参数。)

pInfo.ParameterType不是您要查找的类型吗?

根据文档,PropertyInfo类的ParamterType属性是: “ Type对象,表示此参数的Type。

此外,以下代码给出了预期的输出:

  Type t = typeof (X); var mi = t.GetMethod("Method"); var parameters = mi.GetParameters(); foreach(Type parameterType in parameters.Select(pi => pi.ParameterType)) Console.WriteLine(parameterType.IsByRef ? parameterType.GetElementType() : parameterType); 

编辑:正如John Skeet所指出的,如果参数是由ref; 您应该使用GetElementType来获取正确的类型。 我更新了代码示例。

你也可以使用

 Type type = Type.GetType("System."+ pInfo.ParameterType.Name); 

如果ParameterType.GetElementType()不起作用

看到这个:

 var parameters = methodinfo.GetParameters(); foreach (var parameter in parameters) { var HasValue = ""; Type ParameterType = (parameter.IsOut || parameter.ParameterType.IsByRef) ? parameter.ParameterType.GetElementType() : parameter.ParameterType; if (ParameterType.GetProperties().Count() == 2 && ParameterType.GetProperties()[0].Name.Equals("HasValue")) { HasValue = "?"; ParameterType = ParameterType.GetProperties()[1].PropertyType; } StringBuilder sb = new StringBuilder(); using (StringWriter sw = new StringWriter(sb)) { var expr = new CodeTypeReferenceExpression(ParameterType); var prov = new CSharpCodeProvider(); prov.GenerateCodeFromExpression(expr, sw, new CodeGeneratorOptions()); } var result = string.Concat(sb.ToString(), HasValue, " ", parameter.Name); Console.WriteLine(result); }