我正在使用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#中,方法以相同的方式定义,但我不知道如何传递这些方法。
答案 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");
话虽如此,还有其他与代表合作的方法。您可以使用Func
和Action
代表。 Func
是一个委托,指向一个接受一个或多个参数并返回值的方法,即,它不返回void
。 Action
是一个委托,指向一个方法,该方法又接受一个或多个参数,但不返回任何值(返回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}}元素。