我正在尝试验证参数是否为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。
谢谢, 好色
答案 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);
}