.NET反射 - 如何从ParameterInfo中获取"真实"类型

ran*_*909 19 .net c# reflection

我正在尝试验证参数是否为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;
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢,兰迪

Jon*_*eet 25

一个out参数是"由参" -所以你会发现pInfo.ParameterType.IsByRef返回true.要获取基础not-by-ref类型,请调用GetElementType():

Type realType = pInfo.ParameterType.GetElementType();
Run Code Online (Sandbox Code Playgroud)

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


dri*_*iis 5

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);
Run Code Online (Sandbox Code Playgroud)

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