调用在基本泛型 class 中声明的非泛型方法会抛出异常并显示消息

Invoking a non-generic method which is declared in a base generic class throws exception with message

调用在基本泛型中声明的非泛型方法 class 抛出异常并显示以下消息:

"Late bound operations cannot be performed on types or methods for which ContainsGenericParameters is true"

我在反射方面有不错的经验,但我最近对代码所做的更改导致了一个非常罕见的情况,我无法弄清楚。

我在网上研究了很长时间,并且尝试了很多 possible/suggested 解决方案,但我找不到适合我这种罕见情况的解决方案。

网络上的所有示例都为泛型方法提供了解决方案,但就我而言,我尝试调用的方法不是泛型的。包含该方法的 class 不是通用的。 class 继承了一个基础 class 并且只有这个基础 class 是通用的。

任何人都可以告诉我关于正确调用属于非泛型 class 的非泛型方法的任何想法,该非泛型方法继承自泛型基础 class?

我将尝试找出问题并提供经过高度修剪的示例代码,以便您明白我的意思。

旁注:请不要建议我改变我的方法。我必须通过反射来做到这一点,这个 class 结构不能改变。我正在尝试为这个非常具体的案例找到解决方案。请不要成为不知道具体答案但试图说服我改变方法的人。

// 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();

Example on DotNetFiddle.