2015-07-17 3 views
3

У меня есть несколько методов, которые имеют подобную подпись и пытались преобразовать их в один общий, без использования интерфейсов.Как вызвать общий метод с динамическими свойствами в C#

public List<MultiSelectDropdown> ConvertListOfJobStatusToDropdownListClickable(List<JobStatus> js) { 
     var list = new List<MultiSelectDropdown>(); 
     if (js != null && js.Count >= 1) { 
      list = js.Select(item => new MultiSelectDropdown { Name = item.StatusValue, Value = item.id.ToString() }).ToList(); 
     } 
     return list; 
    } 


    public List<MultiSelectDropdown> ConvertListOfCUsersToDropdownListClickable(List<cUser> users) { 
     var list = new List<MultiSelectDropdown>(); 
     if (users != null && users.Count >= 1) { 
      list = users.Select(item => new MultiSelectDropdown { Name = item.User_Name, Value = item.Id.ToString() }).ToList(); 
     } 
     return list; 
    } 

Это то, что я хотел бы сделать; перейдите в список с двумя свойствами.

List<MultiSelectDropdown> ddlForClientUsers = ConvertToMultiSelectDropdownList(listOfClientsForUser, n => n.Client_Id, v => v.Client); 

List<MultiSelectDropdown> ddlForJobStatus = ConvertToMultiSelectDropdownList(listOfJobStatus, n => n.Id, v => v.JobName); 

Это метод, который я пытался, но не уверен, как получить item.propName и item.propValue работать.

Я получаю «Не удается разрешить» PROPNAME и propValue в методе ниже

Возможно ли это?

public List<MultiSelectDropdown> ConvertToMultiSelectDropdownList<T, TPropertyName, TPropertyValue>(List<T> listOfT, Func<T, TPropertyName> propName, Func<T, TPropertyValue> propValue) { 
var list = new List<MultiSelectDropdown>(); 
     if (listOfT != null && listOfT.Count >= 1) { 
      list = listOfT.Select(item => new MultiSelectDropdown { Name = item.propName, Value = item.propValue }).ToList(); 
     } 
     return list; 
    } 

public class MultiSelectDropdown { 
    public string Name { get; set; } 
    public string Value { get; set; } 
    public bool IsChecked { get; set; } 
} 

ответ

3

Поскольку свойства вашего MultiSelectDropdown являются строками, ваши функции также должны возвращать их. И для вызова функций вы должны написать их как propName(item) вместо item.propName - это синтаксис свойства, и вы указали, что не хотите использовать интерфейсы.

public List<MultiSelectDropdown> ConvertToMultiSelectDropdownList<T>(List<T> listOfT, Func<T, string> propName, Func<T, string> propValue) { 
    var list = new List<MultiSelectDropdown>(); 
    if (listOfT != null && listOfT.Count >= 1) { 
     list = listOfT.Select(item => new MultiSelectDropdown { Name = propName(item), Value = propValue(item) }).ToList(); 
    } 
    return list; 
} 
+1

Или, чтобы держать его красивым и родовое, вызовите .ToString() в результате переданному в функцию - может быть забавным получать даты, чтобы играть хорошо, хотя;) – simonlchilds

1

Вы действительно близко, с небольшой ошибкой. Линия (переформатирован для предотвращения прокрутки):

list = listOfT.Select(item => new MultiSelectDropdown 
            { 
             Name = item.propName, 
             Value = item.propValue 
            }).ToList(); 

должно быть:

list = listOfT.Select(item => new MultiSelectDropdown 
            { 
             Name = propName(item), 
             Value = propValue(item) 
            }).ToList(); 
Смежные вопросы