我有一个命名空间中定义一个Employee类和代码段经由反射是这样调用通过反射接受一个代表作为输入
delegate bool IsPromotable (Employee employee);
class Program
{
public static void Main(string[] args)
{
List<Employee> empList = new List<Employee>();
empList.Add(new Employee() { EmployeeId = 1, EmployeeName = "A", Salary = 7500, Experience = 2 });
empList.Add(new Employee() { EmployeeId = 2, EmployeeName = "B", Salary = 11500, Experience = 6 });
empList.Add(new Employee() { EmployeeId = 3, EmployeeName = "C", Salary = 14500, Experience = 5 });
empList.Add(new Employee() { EmployeeId = 4, EmployeeName = "D", Salary = 10500, Experience = 7 });
IsPromotable isPromotableObj = new IsPromotable(EnableToPromote);
Employee EmployeeObj = new Employee();
EmployeeObj.PromoteEmployees(empList, isPromotableObj);
}
public static bool EnableToPromote(Employee employee)
{
if (employee.Experience >= 5 && employee.Salary >= 10000)
{
return true;
}
else
return false;
}
}
class Employee
{
public int EmployeeId { get; set; }
public string EmployeeName { get; set; }
public int Salary { get; set; }
public int Experience { get; set; }
public void PromoteEmployees(List<Employee> employeeList, IsPromotable isPromotableObj)
{
foreach (Employee employee in employeeList)
{
if (isPromotableObj(employee))
{
Console.WriteLine(" {0} will be promoted in the next R.P. Cycle ", employee.EmployeeName);
}
}
Console.ReadKey();
}
}
现在从一个单独的类在一个单独的名称空间中的方法我想要获得类型以及与之相关的所有其他类型的对象。另外我想调用PromoteEmployee()方法。我怎么做 ?
Console.WriteLine("***************Loading External assembly*************");
Assembly assembly = Assembly.LoadFrom(@"C:\Users\Chiranjib\Documents\visual studio 2012\Projects\DelegatesSampleApplication\DelegatesSampleApplication\bin\Debug\DelegatesSampleApplication.exe");
Type employeeType = assembly.GetType("DelegatesSampleApplication.Employee"); //Gets the System.Type object for the Employee Class from the just loaded assembly with all it's dependencies
object employeeInstance = Activator.CreateInstance(employeeType);//Create an instance of the Employee Class Type
//sets it's properites
Console.WriteLine("***************Setting External assembly propeties for the second instance*************");
object employeeInstance2 = Activator.CreateInstance(employeeType);
//set's it's properties
Console.WriteLine("***************Creating an array list that will hold these employee instances***************");
List<Object> employeeInstanceList = new List<object>();
employeeInstanceList.Add(employeeInstance);
employeeInstanceList.Add(employeeInstance2);
Console.WriteLine("***************Invoking External assembly methods*************");
var agrsDel = new Object[] {(employeeInstance) => return employeeInstance};
dynamic value = employeeType.InvokeMember("PromoteEmployees", BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public, null, employeeInstance, new Object[] {employeeInstanceList,args})});
Console.ReadKey();
但我得到的错误是agrsDel不能隐蔽lambda表达式的一个对象,其次对象不包含对雇员的定义。我错过了什么?
如果你想知道为什么没有任何反应,甚至没有评论,你的代码是非常难读......怎么样简化它并只发布重现问题所需的代码? – Eser
就此工作。现在希望得到回应。感谢您指出@Eser – StrugglingCoder
'agrsDel'变量的用途是什么?你没有在代码中使用它。你也应该尝试'employeeType.GetMethod(“PromoteEmployees”)。调用(...)' – thepirat000