Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET反射-如何获取;“真正的”;从输出参数输入信息_C#_.net_Reflection - Fatal编程技术网

C# .NET反射-如何获取;“真正的”;从输出参数输入信息

C# .NET反射-如何获取;“真正的”;从输出参数输入信息,c#,.net,reflection,C#,.net,Reflection,我试图验证一个参数是否同时是out参数和扩展接口(ICollection)。反射api似乎不想给我参数的“real”类型,只希望在IsAssignableFrom语句中的末尾带有“&”的参数不能正确计算。我已经写了一些c代码,但似乎应该有更好的方法来实现这一点 bool isCachedArg(ParameterInfo pInfo) { if (!pInfo.IsOut) return false; string typeName = pInfo.Pa

我试图验证一个参数是否同时是out参数和扩展接口(ICollection)。反射api似乎不想给我参数的“real”类型,只希望在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?我还在.NET2.1上

谢谢,
Randy是pInfo.ParameterType不是您要找的类型吗

根据文档,PropertyInfo类的ParamterType属性为:

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

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

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

(当然,只有通过ref才能这样做。这也适用于
ref
参数)。

您也可以使用

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

如果我发现参数类型是bool或int或其他类型,我如何创建该类型的实例,给它一个值,然后用数组或参数调用方法或构造函数?pInfo.ParameterType.GetElementType();为我的布尔参数返回null。Type.GetType(pi.ParameterType.FullName)得到我想要的,但是现在我如何实际生成一个布尔值并给它一个值,这样我就可以把它给一个方法或构造函数?@towps是的,对于一个简单的布尔参数,它将返回null-它没有元素类型。你的问题有点混乱,听起来它应该是一个完整的问题,而不仅仅是对另一个问题的答案的评论。编译器应用于
out
参数,并使用它来区分
out
参数和
ref
参数。我花了一天时间试图找到/编写类似的东西。没有人欣赏它,所以我在这里。谢谢你!
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);
}