У меня есть класс 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 не может тайному лямбда-выражения к объекту и во-вторых, объект не содержит определения для EmployeeID. Что мне не хватает?
Если вам интересно, почему нет никакого ответа, даже не комментарий, ваш код очень трудно читать ... Как насчет упростить его и опубликовать только код, необходимый для воспроизведения проблемы? – Eser
Работал над этим. Надеюсь получить ответы сейчас. Спасибо за указание @Eser – StrugglingCoder
Какова цель этой переменной 'agrsDel'? Вы не используете его в коде. Вы также должны попробовать 'employeeType.GetMethod (« PromoteEmployees »). Invoke (...)' – thepirat000