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

时间:2018-08-07 23:15:09

标签: c# generics reflection invoke postsharp

调用在基类中声明的非泛型方法时,此消息将引发异常:

“不能对包含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");
    }
}

2 个答案:

答案 0 :(得分:3)

正如评论所暗示的,问题中缺少一些东西。

无论什么情况都相等,这应该起作用,关键是BaseType

var subClassB = new SubClassB();

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

ValidationMethod?.Invoke(subClassB, null);

答案 1 :(得分:0)

不需要反射。通常,您可以通过非通用接口来解决此问题:

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