我有一个叫做Employee的课程。其中有三个自动实现的属性和一个返回git奖金工资的员工姓名的函数,我使用委托,所以这个函数没有逻辑,这就是这个类和方法可重用的原因。
class Employee
{
public int Id { get; set; }
public string Name { get; set; }
public int Salary { get; set; }
public static void BonusForEmp(List<Employee> emp, Bonus Isavailable)
{
foreach (Employee e in emp)
{
if (Isavailable(e))
{
Console.WriteLine(e.Name + " got bonus");
}
}
}
}
delegate bool Bonus(Employee Employes); // Delegate
这是我的主要方法,我在其中创建员工列表并执行所有步骤,例如创建实例并将方法作为参数传递。
List<Employee> EmpList = new List<Employee>();
EmpList.Add(new Employee() { Id = 1, Name = "A", Salary = 12000});
EmpList.Add(new Employee() { Id = 2, Name = "B", Salary = 7999 });
EmpList.Add(new Employee() { Id = 3, Name = "C", Salary = 1999 });
EmpList.Add(new Employee() { Id = 4, Name = "D, Salary = 20000});
Bonus B = new Bonus(BonusAvailabeFor); //instance of dlegate and pasing method name as an argument
Employee.BonusForEmp(EmpList, B); //using
Console.ReadLine();
所以你们所有人都在想我的方法(BonusAvailableFor)在哪里我完成了与委托签名相匹配的所有逻辑工作?这是
public static bool BonusAvailabeFor(Employee eml) // the function with same signature of the delegate here we use our logic.
{
if (eml.Salary > 8000)
{
return true;
}
else
{
return false;
}
}
所以这段代码工作非常好,并返回员工的姓名,其薪水&gt; 8000。 我只是在某处读取了一个内联表达式的匿名方法,可以在任何需要委托类型的地方使用。它为我们提供了一种创建委托实例的方法,而无需编写单独的方法..定义看起来很棒它会减少我的行代码,如果我可以在我的场景中实现这一点,那么我怎样才能实现它? &lt; ===(我的问题) 我知道我可以用Lambda表达式或FindAll()预定义函数在列表集合类中做到这一点,但我在这里用匿名方法来做..
答案 0 :(得分:1)
假设我正确理解了您的问题,delegate
关键字有多种用途。一种用途是定义新的委托类型;另一个用途是创建一个匿名方法。后者可以在您的示例中用作:
Bonus B = delegate (Employee e) { return e.Salary > 8000; };
您可以省略分配给变量并将匿名方法直接传递给方法:
Employee.BonusForEmp(EmpList, delegate (Employee e) { return e.Salary > 8000; });
...但这会使该行有点冗长(即不可读)。就个人而言,我会把它打破。