C#传递方法作为参数

时间:2018-03-30 10:43:35

标签: c# c++ c api pointers

我正在使用C#中的C API。在C中,方法作为参数传递,我试图在C#中完成同样的事情。

C 中我会按以下方式调用这些函数:

void OnStatusRcv(ll_status_t status)
void scanCb(ll_scan_result_t *result)

请注意,使用的方法按以下方式定义:

personObj = {
  _id : '123',
  first_name: 'John',
  last_name: 'Doe',
}

在C#中,方法以相同的方式定义,但我不知道如何传递这些方法。

4 个答案:

答案 0 :(得分:7)

C#等效的函数指针是委托。您可以使用Func和Action将方法作为参数传递。 Func委托表示采用N个参数并返回值的方法,Action委托表示void方法。

考虑一下

using OpenQA.Selenium.Support.UI;

// Identify the drop downdown element
var cities = driver.FindElement(By.XPath("//select[@class='_fsoey']"));
//create select element object 
var selectElement = new SelectElement(cities);

//select by value
selectElement.SelectByValue("en"); 
// select by text
selectElement.SelectByText("English");
C#中的

将是

void (* myFunction)(int parameter) 

答案 1 :(得分:0)

请尝试以下代码:

创建ll_scan_result_t和ll_status_t类。

class Program
{
    delegate void ActionRef<T>(ref T item);

    static void Main(string[] args)
    {
        ll_status_t _status = new ll_status_t();

        LL_SetStatusCb(_status, OnStatusRcv);

        ll_scan_result_t _scan = new ll_scan_result_t();

        LL_SetScanCb(ref _scan);
    }

    static void LL_SetScanCb(ref ll_scan_result_t status, ActionRef<ll_scan_result_t> getCachedValue)
    {
        //... do something
    }

    static void LL_SetStatusCb(ll_status_t result, Action<ll_status_t> getCachedValue)
    {
        //... do something
    }

    static void OnStatusRcv(ref ll_scan_result_t sresult)
    {
        //... do something
    }

    static void scanCb(ll_status_t s)
    {
        //... do something
    }
}

答案 2 :(得分:0)

使用Func Delegate,如下所示

public class myClass
{

    public bool TestMethod(string input)
    {
        return true;
    }
    public bool Method1(Func<string, bool> methodName)
    {
        return true;
    }

    public void newMthod()
    {
        Method1(TestMethod);
    }
}

答案 3 :(得分:0)

在C#中,等效于C / C ++ 函数指针的是代理。委托是一种类型,表示对具有特定参数列表和返回类型的方法的引用。实例化委托时,可以将其实例与具有兼容签名和返回类型的任何方法相关联。您可以通过委托实例调用该方法。

这是一个例子。首先,声明一个委托:

public delegate void Del(string message);

现在,Del是一种委托类型,可用于调用任何返回void并接受string类型的参数的方法。现在,让我们创建一些与Del的签名和返回类型匹配的方法:

public static void DelegateMethod(string message)
{
    Console.WriteLine(message);
}

现在,让我们创建一个Del的实例并将其与DelegateMethod关联,如下所示:

Del handler = DelegateMethod;

如果您要致电DelegateMethod,可以通过以下方式实现:

handler("Hello World");

请注意,由于Del是一种类型,因此您可以执行以下操作:

public static void SomeMethod(Del callback, string callbackParams)
{
    callback(callbackParams);
}

可以用作:

SomeMethod(handler, "Hello World");

话虽如此,还有其他与代表合作的方法。您可以使用FuncAction代表。 Func是一个委托,指向一个接受一个或多个参数并返回值的方法,即,它不返回voidAction是一个委托,指向一个方法,该方法又接受一个或多个参数,但不返回任何值(返回void)。换句话说,当委托指向返回Action的方法时,应使用void

以下是使用Action委托的示例:

static void Main(string[] args)
{
    Action<string> action = new Action<string>(Display);
    action("Hello!!!");
    Console.Read(); //Prevents from closing the command line right away.
}

static void Display(string message)
{
    Console.WriteLine(message);
}

因此,类似

void (* funcPtr)(int) = &someFuncWithAnIntArg;
(*funcPtr)(10); 

在C#中等效于

Action<int> funcPtr = new Action<int>(someFuncWithAnIntArg);
funcPtr(10);

现在是Func代表:

static void Main(string[] args)
{
    Func<int, double> func = new Func<int, double>(CalculateHra);
    Console.WriteLine(func(50000));
    Console.Read();
}

static double CalculateHra(int basic)
{
    return (double)(basic * .4);
}

Func代表接受一个参数并返回一个值的语法类似于Func<TArgument, TOutput>,其中TArgument是参数的类型,而TOutput是参数的类型返回值。 Func(浏览左侧树索引)和Action(还浏览左侧树索引)委托的类型更多。

最后但并非最不重要的一点是,我们有Predicate代表,通常用于搜索集合或一组数据中的项目。让我们定义一些样板代码来解释:

class Customer
{
    public int Id { get; set; }
    public string FirstName { get; set; }
}

然后,让我们尝试一下:

static void Main(string[] args)
{
   List<Customer> customers = new List<Customer>();
   customers.Add(new Customer { Id = 1, FirstName = "Stack" });
   customers.Add(new Customer { Id = 2, FirstName = "Overflow" });

   Predicate<Customer> pred = x => x.Id == 1;
   Customer customer = customers.Find(pred);
   Console.WriteLine(customer.FirstName);
   Console.Read();
}

最后一个代码段将显示“ Stack”。发生的事情是,名为Predicate的{​​{1}}代表被用作搜索条件,以在列表prep中进行搜索。基本上,此委托是在列表的每个元素customers上运行的,当x返回x.Id == 1时,返回true。作为false方法的结果,返回谓词返回x的{​​{1}}元素。