我在泛型类中有一个泛型方法。在这个方法中,如果方法的泛型参数的类型不是映射的,而是父类型,我需要为父类型调用相同的方法。我对这两位代码得到了不同的结果,尽管我希望它们是相同的。
这成功了:
MethodInfo methodInfo2 = this.GetType().GetMethods()[9]; // this is the correct one.
methodInfo2 = methodInfo2.MakeGenericMethod(mappedType);
这崩溃了:
MethodInfo methodInfo1 = System.Reflection.MethodBase.GetCurrentMethod() as MethodInfo;
methodInfo1 = methodInfo1.MakeGenericMethod(mappedType);
除了这个例外:
GenericArguments[0], 'GenericClassConstraintAbstract.Abstract', on 'System.Collections.Generic.IList`1[Entity] GetEntities[Entity](System.Linq.Expressions.Expression`1[System.Func`2[Entity,System.Boolean]], Sbu.Sbro.Common.Core.Pagination.Paginator`1[Entity])' violates the constraint of type 'Entity'.
如果我添加methodInfo1 == methodInfo2
调试器手表,我会得到false
,但我不知道有什么区别。我可能比使用[9]
选择正确的方法并这样做更聪明,但我也想知道为什么崩溃的版本会这样做。
有任何想法吗?
编辑:现在有更好的例子:
interface BaseInterface
{ }
interface MyInterface : BaseInterface
{ }
abstract class Abstract : MyInterface
{ }
class Concrete : Abstract, MyInterface
{ }
class ProblemClass<GenericType> where GenericType : BaseInterface
{
public virtual IList<Entity> ProblemMethod<Entity>() where Entity : class, GenericType
{
if (typeof(Entity) == typeof(Concrete))
{
MethodInfo methodInfo = System.Reflection.MethodBase.GetCurrentMethod() as MethodInfo;
var t1 = this.GetType(); // perhaps the problem resides in
var t2 = methodInfo.DeclaringType; // these two not being equal?
methodInfo = methodInfo.MakeGenericMethod(typeof(Abstract));
return (methodInfo.Invoke(this, new Object[] { }) as IList).OfType<Entity>().ToList();
}
else
{
return new List<Entity>();
}
}
}
class Program
{
static void Main(string[] args)
{
new ProblemClass<MyInterface>().ProblemMethod<Concrete>();
}
}