[英].NET Reflection - How to get “real” type from out ParameterInfo
我正在尝试验证参数是否为out参数并扩展接口(ICollection)。 反射api似乎不想给我参数的“真实”类型,只有最后一个“&”的参数不会在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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.