调用在基类中声明的非泛型方法会引发异常和消息



调用在基类中声明的非泛型方法会引发异常,并显示以下消息:

"不能对ContainsGenericParameters为true的类型或方法执行后期绑定操作">

我有很好的反思经验,但最近我对代码所做的更改导致了一个非常罕见的情况,我无法弄清楚。

我研究了很长一段时间的网络,尝试了许多可能的/建议的解决方案,但我找不到我的罕见案例的解决方案。

网络上的所有例子都为通用方法提供了解决方案,但在我的情况下,我试图调用的方法不是通用的。包含该方法的类不是泛型的。该类继承了一个基类,并且只有这个基类是泛型的。

有人能给我一些关于正确调用非泛型方法的想法吗?该方法属于从泛型基类继承的非泛型类?

我将尝试隔离这个问题,并提供经过高度修剪的示例代码,以便您能够理解我的意思。

旁注:请不要建议我改变我的方法。我必须通过反射来完成这项工作,并且这个类结构不能改变。我正试图为这个非常具体的案件找到解决方案。请不要成为那个不知道具体答案但试图说服我改变方法的人。

// Execution starts here in some code piece.
// We don't know the type of Instance.
// It can either be SubClassA or SubClassB.
{
// This finds the method correctly. It doesn't return null.
MethodInfo ValidationMethod = Instance.GetType().GetMethod("Validate", BindingFlags.NonPublic | BindingFlags.Instance);
// This throws the exception with the message shown above.
ValidationMethod.Invoke(Instance, null);
}
public class SubClassA : BaseClass<EventArgs>
{
}
public class SubClassB : BaseClass<CancelEventArgs>
{
}
public abstract class BaseClass<T>
{
void Validate()
{
Debug.Log("Validating");
}
}

正如评论所示,这个问题缺少了一些东西。

然而,在所有条件相同的情况下,这应该有效,关键是BaseType

var subClassB = new SubClassB();
var ValidationMethod = subClassB.GetType()
.BaseType?
.GetMethod("Validate", BindingFlags.NonPublic | BindingFlags.Instance);
ValidationMethod?.Invoke(subClassB, null);

不需要反射。通常解决此问题的方法是使用非通用接口:

interface IBase
{
void Validate();
}
public abstract class BaseClass<T> : IBase
{
public void Validate()
{
Debug.Log("Validating");
}
}
public class SubClassA : BaseClass<EventArgs>
{
}
public class SubClassB : BaseClass<CancelEventArgs>
{
}

要调用Validate(),您可以使用:

IBase o = Instance;
o.Validate();

DotNetFiddle上的示例。

最新更新