使用反射测试方法是否具有特定签名
Testing whether a method has a specific signature using Reflection
我正在编写一个摘要 class,它(在其构造函数中)收集所有遵循特定签名的静态方法。它收集的方法必须类似于:
static ConversionMerit NAME(TYPE1, out TYPE2, out string)
这里我不关心命名,或者前两个参数的类型,但是第二个和第三个参数必须是'out'个参数,第三个必须是System.String个类型.
我的问题是最后的字符串检查:
MethodInfo[] methods = GetType().GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static);
foreach (MethodInfo method in methods)
{
if (method.ReturnType != typeof(ConversionMerit))
continue;
ParameterInfo[] parameters = method.GetParameters();
if (parameters.Length != 3)
continue;
if (parameters[0].IsOut) continue;
if (!parameters[1].IsOut) continue;
if (!parameters[2].IsOut) continue;
// Validate the third parameter is of type string.
Type type3 = parameters[2].ParameterType;
if (type3 != typeof(string)) // <-- type3 looks like System.String&
continue;
// This is where I do something irrelevant to this discussion.
}
第三个 ParameterInfo 的 ParameterType 属性 告诉我类型是 System.String&,与 typeof(string) 比较失败。执行此检查的最佳方法是什么?使用字符串比较来比较类型名对我来说听起来有点笨拙。
System.String& 如果你的方法参数由 ref 传递或者是一个 out 参数,则返回。当一个字符串正常传递时,它将显示为 System.String 然后将与您的 if 条件匹配
if (type3 != typeof(string))
为了比较 ref 类型,你可以这样做
if (type3 != typeof(string).MakeByRefType())
您需要使用MakeByRefType
方法获取string&
的类型。然后将其与给定的类型进行比较。
if (type3 != typeof(string).MakeByRefType())
我正在编写一个摘要 class,它(在其构造函数中)收集所有遵循特定签名的静态方法。它收集的方法必须类似于:
static ConversionMerit NAME(TYPE1, out TYPE2, out string)
这里我不关心命名,或者前两个参数的类型,但是第二个和第三个参数必须是'out'个参数,第三个必须是System.String个类型.
我的问题是最后的字符串检查:
MethodInfo[] methods = GetType().GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static);
foreach (MethodInfo method in methods)
{
if (method.ReturnType != typeof(ConversionMerit))
continue;
ParameterInfo[] parameters = method.GetParameters();
if (parameters.Length != 3)
continue;
if (parameters[0].IsOut) continue;
if (!parameters[1].IsOut) continue;
if (!parameters[2].IsOut) continue;
// Validate the third parameter is of type string.
Type type3 = parameters[2].ParameterType;
if (type3 != typeof(string)) // <-- type3 looks like System.String&
continue;
// This is where I do something irrelevant to this discussion.
}
第三个 ParameterInfo 的 ParameterType 属性 告诉我类型是 System.String&,与 typeof(string) 比较失败。执行此检查的最佳方法是什么?使用字符串比较来比较类型名对我来说听起来有点笨拙。
System.String& 如果你的方法参数由 ref 传递或者是一个 out 参数,则返回。当一个字符串正常传递时,它将显示为 System.String 然后将与您的 if 条件匹配
if (type3 != typeof(string))
为了比较 ref 类型,你可以这样做
if (type3 != typeof(string).MakeByRefType())
您需要使用MakeByRefType
方法获取string&
的类型。然后将其与给定的类型进行比较。
if (type3 != typeof(string).MakeByRefType())