حلقة عامة لكل خاصية مختلفة
-
21-12-2019 - |
سؤال
أحاول استخدام طريقة عامة لحلقة فوريش التي من شأنها تمرير معلمة مختلفة كوسيطة.
في هذا المثال أدناه أود أن تمرير معلمات مختلفة (إمبوسيديديسبلايوردر أو إمبوسيدينرولوردر)
public void SaveEmployeeDisplayOrder(ICollection<Employee> employees)
{
//some code
foreach( var emp in employees)
{
UpdateSpecificEmployeeOrder(employee.id, e => e.EmployeeDisplayOrder);
}
}
public void SaveEmployeeEnrollOrder(ICollection<Employee> employees)
{
//some code
foreach( var emp in employees)
{
UpdateSpecificEmployeeOrder(employee.id, e => e.EmployeeEnrollOrder);
}
}
أود الحصول على شيء من هذا القبيل
public void UpdateEmployeeOrders(ICollection<Employee> employee)
{
foreach( var emp in employees)
{
UpdateSpecificEmployeeOrder(employee.id, //generic property);
}
}
واستدعاء هذه الطريقة العامة أوبداتيمبلويوردرز من سافيمبلويدسبلايوردر و سافيمبلويينرولوردر.
طريقة التوقيع للتحديثموظف محددأمر
UpdateSpecificEmployeeOrder( int employeeid, params Expression<Func<Employee, object>>[] property)
هل هذا ممكن?
المحلول
لديك إجابة في إجابتك ... أنت تستخدم Lambdas ... حتى تمرد مندوب في طريقتك.
giveacodicetagpre.ثم تسميها مماثلة لما كان لديك:
giveacodicetagpre.أو
giveacodicetagpre.نصائح أخرى
اجعل الطريقة تقبل تعبيرا ، تماما كما تفعل الطريقة التي تمررها إليها:
public class Foo
{
public void UpdateEmployeeOrders(IEnumerable<Employee> employees,
Expression<Func<Employee, object>> selector)
{
foreach (var employee in employees)
{
UpdateSpecificEmployeeOrder(employee.id, selector);
}
}
}
أيضا ، منذ الشيء الوحيد الذي نفعله من أي وقت مضى مع employees
هو تكرار أكثر من ذلك ، يمكننا كتابة المعلمة كما IEnumerable
بدلا من ICollection
.يوفر جميع الضمانات التي تحتاجها هذه الأساليب ، مع السماح بنطاق أوسع من أنواع المدخلات الممكنة.