如何在C#中使用泛型来调用C函数

Mar*_*lle 2 c# generics

我有两个函数在内部调用c函数

void do_double(double[] p1)
{
    // some c-function called with (double*)
}

void do_float(float[] p1)
{
    // some c-function called with (float*)
}
Run Code Online (Sandbox Code Playgroud)

而不是do_floatdo_double我想创造一些泛型参数的方法来调用这个C函数。例如:

void do_generic<T>(T[] p1)
{
    if (typeof(T) == typeof(float))
        do_float(T);
    else if ( ...double)
        do_double(T);
}
Run Code Online (Sandbox Code Playgroud)

做这个的最好方式是什么?将T转换为float / double似乎不是正确的方法。

Bio*_*ode 5

这是典型的代码嗅觉场景。这种类型切换无法缩放。解决方案是泛化或重载。

方法重载:

class DoSomething
{
  public void Do(double[] args)
  {
    do_double(args);
  }

  public void Do(float[] args)
  {
    do_float(args);
  }

  public void Do(int[] args)
  {
    do_int(args);
  }
}
Run Code Online (Sandbox Code Playgroud)

或归纳并提供一个确切知道如何处理特定参数类型的实现:

interface IDoSomething<T>
{
  void Do(T[] args);
}

class DoDouble : IDoSomething<double>
{
  public void Do(double[] args)
  {
    do_double(args);
  }
}

class DoFloat : IDoSomething<float>
{
  public void Do(float[] args)
  {
    do_float(args);
  }
}
Run Code Online (Sandbox Code Playgroud)