【发布时间】:2011-05-09 18:41:51
【问题描述】:
我刚刚不幸(至少对我的应用程序而言)发现在泛型类中声明的两个方法没有相同的基本定义,这在代码中得到了最好的证明:
public static class Test
{
private class Generic<T> { public void Method() { } }
public static void TestBase()
{
var x = typeof(Generic<int>).GetMethod("Method");
var y = typeof(Generic<double>).GetMethod("Method");
Debug.Assert(x.GetBaseDefinition() == y.GetBaseDefinition()); // fails
}
}
x 和 y.IsGeneric 均为 false,因此无法使用 GetGenericMethodDefinition。
到目前为止,我能想到的唯一解决方案是比较它们的名称,并且它们的声明类型是相同的泛型类型,但是存在看起来非常脆弱的重载..
所以.. 我想我在反射库中没有遗漏什么有用的方法可以告诉我这两个方法是否首先在同一个类中声明?还是解决方法?
编辑:
为了澄清,我想做一个方法:
public bool DeclaredInSameClass(MethodInfo a, MethodInfo b);
如果 a 和 b 都首先在同一个类中声明,则返回 true。
忽略泛型,这很简单:a.GetBaseDefinition() == y.GetBaseDefinition(),但是如何处理泛型类中声明的方法?
【问题讨论】:
-
您不只是请求查看 MethodsCollection 是否包含对所选 MethodInfo 的引用吗?也许是一个用例来说明这在什么时候有用?
-
模板的两种实现之间的类型不同的事实意味着它们在定义上是不同的。您说您想查看它们是否定义在同一个类中,但 Generic
与 Generic 并不完全相同。 -
@James (/Tejs),不幸的是,他们在同一个班级中被宣布对我来说意义重大。基本上,我希望能够知道两个类(每个类共享一堆属性)是否有任何共同的部分——以允许将设置从一个类复制到另一个类。这不仅适用于任何课程 - 我确实可以控制课程并且仅供内部使用,但知道它会非常有用。属性使事情进一步复杂化,所以我很高兴将问题留在方法上;)。目前这一切都运作良好,直到涉及到泛型我可能会添加..
标签: c# .net generics reflection