我想要使用反射来获取接受Action<T>
参数的方法定义。我正在使用.NET核心1.1。使用反射比较通用参数类型
由于该类有两个具有相同名称的方法,我试图检查接受的参数的类型,以确保我得到正确的方法定义(而不是其他重载),但比较似乎没有工作。
下面是一些代码,显示了这个问题:
using System;
using System.Linq;
using System.Reflection;
class ReflectMe {
public void SomeMethod<T>(Action<T> action) {
action(default(T));
}
public T SomeMethod<T>() {
return default(T);
}
}
class Program {
static void Main(string[] args) {
var reflectedMethod = typeof(ReflectMe).GetTypeInfo().GetMethods(BindingFlags.Public | BindingFlags.Instance)
.Where(m => m.Name == "SomeMethod" && m.IsGenericMethodDefinition)
.Where(m => {
var parameters = m.GetParameters();
if (parameters.Count() != 1) {
// this filters out the 1st method
return false;
}
var actionType = typeof(Action<>);
var parameterType = parameters[0].ParameterType;
if (parameterType == actionType) {
// this is always false, even if in the debugger both
// types are displayed as System.Action`1[T]
return true;
}
return false;
})
.FirstOrDefault();
}
}
的问题是,parameterType
和actionType
是不相等的,但是当我在调试器中检查它们看起来相同。
为什么比较失败?
你调试?你有**两种**方法吗?每种方法的**是什么**'parameterType'? –
调试我按预期得到了两个方法,对于这两个参数,参数类型都是Action'1 [T]。我更新了这个问题。 –
动作<>!=动作,请参阅Titans答案 –
bgura