C# .NET反射-如何获取;“真正的”;从输出参数输入信息
我试图验证一个参数是否同时是out参数和扩展接口(ICollection)。反射api似乎不想给我参数的“real”类型,只希望在IsAssignableFrom语句中的末尾带有“&”的参数不能正确计算。我已经写了一些c代码,但似乎应该有更好的方法来实现这一点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
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);
}