我已经查看了一些关于反射和重载方法的帖子,但没有找到任何有用的信息。我找到了一个帖子(链接),但没能得到太多帮助。
我有以下两个方法:
1 | public void Delete<T>(T obj) where T : class { ... }
2 | public void Delete<T>(ICollection<T> obj) where T : class { ... }
我正在尝试获取第一种方法。
我尝试了经典的GetMethod("Delete")
方法,但由于有两个同名方法,所以抛出了Ambiguous
异常。我尝试通过添加一个额外的参数来指定方法模式,例如GetMethod("Delete", new [] { typeof(Object) })
,但没有找到任何东西(返回null)。
我想我可能只需循环遍历所有方法并检查参数。
我编写了以下方法...
public static IEnumerable<MethodInfo> GetMethods(this Type type, String name, Type schemaExclude)
{
IEnumerable<MethodInfo> m = type.GetRuntimeMethods().Where(x => x.Name.Equals(name));
return (from r in m let p = r.GetParameters() where !p.Any(o => schemaExclude.IsAssignableFrom(o.ParameterType)) select r).ToList();
}
...该方法返回不包含参数类型为schemaExclude
的方法。
我像这样调用它:GetMethods("Delete", typeof(ICollection))
,但结果并不如预期。
显然,..ICollection'1[T]
不可分配给 ICollection
。它也不可分配给 IEnumerable
、 IEnumerable<>
和 ICollection<>
。我又尝试了 typeof(Object)
,这次可以正常工作,但是返回了所有方法(就像它应该做到的那样)。
我错过了什么?
ICollection
参数的“Delete”方法,但没有找到这样的方法。 - Lasse V. KarlsenT
?那么,例如GetMethods("Delete", typeof(ICollection<int>))
就很简单了。否则,你需要在前面构建运行时类型,使用Type.MakeGenericType
。 - MakePeaceGreatAgainT
可以是我的领域中支持的任何模型。我处理的对象是一个代理对象,这意味着我被迫使用反射来访问具有适当泛型类型的方法。我可以尝试在运行时构建泛型类型以获取ICollection<T>
,但我不确定这是否与方法的模式匹配。让我试一下... - товіаѕtypeof(ICollection<>).MakeGenericType(t)
,其中 t 等于 Entity Framework 模型类型。我的方法返回了两个方法作为结果,这意味着它与模式不匹配。 - товіаѕ