How to call a generic method with dynamic properties in C #

I have several methods that have a similar signature and tried to convert them to one generic one, without using interfaces.

 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;
    }

      

This is what I would like to do; go to the list with two properties.

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

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

      

This is the method I tried but not sure how to get item.propName and item.propValue to work.

I am getting "Cannot resolve" propName and propValue in the method below

Is it possible?

 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


source to share


2 answers


Since the properties of your MultiSelectDropdown are strings, your functions should return them as well. And to call functions, you have to write them as propName(item)

instead of item.propName

- this is property syntax and you indicated that you don't want to use interfaces.



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;
}

      

+3


source


You are really close, with a slight mistake. String (reformatted to prevent scrolling):

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

      



should be:

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

      

+1


source







All Articles