.NET Reflection - 如何从ParameterInfo中获取“真实”类型

时间:2009-04-10 17:19:54

标签: c# .net 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;
}

有没有办法在不从字符串名称重新加载Type的情况下获取realType?我还在使用.NET 2.1。

谢谢, 好色

4 个答案:

答案 0 :(得分:24)

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

Type realType = pInfo.ParameterType.GetElementType();

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

答案 1 :(得分:5)

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

根据文档,PropertyInfo类的ParamterType属性是: "The Type object that represents the Type of this parameter."

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

    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指出的那样,如果参数是参考;您应该使用GetElementType来获取正确的类型。我更新了代码示例。

答案 2 :(得分:0)

您也可以使用

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

如果ParameterType.GetElementType()不起作用

答案 3 :(得分:0)

见:

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);
}