在c#运行时确定的泛型类型上调用非泛型方法

本文关键字:调用 泛型方法 泛型类型 运行时 | 更新日期: 2023-09-27 18:02:10

我想在泛型类型上调用非泛型方法。这是因为我知道类型T在运行时肯定会有这个方法。c#不允许这样做,所以我查找了解决方案,但我没有找到一个解决这个问题的。

1)我尝试使用动态类型,但遇到了一个问题,我仍然没有找到答案:一个或多个类型需要编译一个动态表达式c#

2)我尝试定义一个接口,我定义了在generic_method中实例化的委托。这不起作用,因为在generic_method中,我无法访问委托,即使我将其传递给函数。

private interface MessageMethods
{
    public delegate void MethodDelegate(DirectBuffer buffer, int offset, int actingBlockLength, int actingVersion); 
}
private static T generic_method<T>(byte[] pinned_memory, ref int offset) where T: MessageMethods
{
    MethodDelegate m = new MethodDelegate(someFunctionSomewhereElse()); 
    // Visual studio does not recognize what MethodDelegate is, so this does not work.
    // someFunctionSomewhereElse() is NOT generic
}

我已经看过使用反射的问题,但这是我第一次处理这种程度的泛型类型,不幸的是,我很难理解如何在c#中使用反射。我还能尝试什么?

在c#运行时确定的泛型类型上调用非泛型方法

这是不完全清楚的格式的代码,但我认为这是你的问题:

MethodDelegate是一个私有接口MessageMethods中的委托。

你应该把你的接口设为公共的,并在generic_method中使用以下语法:

private static T generic_method<T>(byte[] pinned_memory, ref int offset) where T : MessageMethods
{
    MessageMethods.MethodDelegate m = new MessageMethods.MethodDelegate(someFunctionSomewhereElse); // also, don't use the extra (), because you probably don't want to call the method yet.
}