指针作为泛型类型参数

时间:2017-12-04 22:26:32

标签: c# generics void-pointers unsafe

我有一堆外部C函数,在C#中变成这样的东西:

public extern static int clGetDeviceInfo(
    IntPtr device, 
    uint param_name, 
    IntPtr param_value_size, 
    void* param_value, 
    out IntPtr param_value_size_ret);

因为有一堆看似相似的函数,我想创建一个读取这些C函数提供的数据的方法。这就是我的用途:

unsafe public static ErrorCode GetInfoString(
    IntPtr handle, uint property, 
    Func<IntPtr, uint, IntPtr, void*, IntPtr, int> infoFunc, 
    out string value)
{
    // reading logic
}

我的问题是C#不允许我使用void*作为Func的通用参数。有没有解决这个问题的方法?

我既不能改变外部C函数的签名,也不能改变C#函数的签名(我使用库)。

2 个答案:

答案 0 :(得分:5)

  

我的问题是C#不允许我使用hidden_action := hidden_action ||’&userid=’ ||get_application_property(username)||’/’|| get_application_property(password)||’@’|| get_application_property(connect_string); 作为Func的泛型参数。有没有解决这个问题的方法?

是。使用void*使用您目前所在的IntPtr 。如果可以避免,请不要在C#中使用void*

  

我无法更改我试图作为参数传递的函数的签名,因此无法正常工作。

确实如此。

void*

您无法更改它,因为它位于库中。精细。 可以你改变什么?您可以更改自己的代码。所以编写自己的代码!你是一个计算机程序员;那就是你做的:

public extern static int clGetDeviceInfo(
    IntPtr device, 
    uint param_name, 
    IntPtr param_value_size, 
    void* param_value, 
    out IntPtr param_value_size_ret);

在那里,现在你有一个方法有一个签名,你可以用private static int MyClGetDeviceInfo( IntPtr device, uint param_name, IntPtr param_value_size, IntPtr param_value, out IntPtr param_value_size_ret) { unsafe { return clGetDeviceInfo(device, param_name, param_value_size, (void*)param_value, out param_value_size_ret); } }

答案 1 :(得分:0)

正如@MarcinJuraszek指出:

  

您可以定义自定义委托类型,而不是重用Func

是的,我可以。使用代表为我工作。

unsafe public delegate int GetInfoMethod(
    IntPtr handle, uint param_name, IntPtr param_value_size, 
    void* param_value, out IntPtr param_value_size_ret);

unsafe public static ErrorCode GetInfoString(
    IntPtr handle, uint property, 
    GetInfoMethod infoFunc, 
    out string value)
{
    // reading logic
}