如何在C#中使用动态属性调用通用方法

3
我有几个方法的签名相似,想将它们转换为一个通用方法,但不使用接口。
 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; }
}
2个回答

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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接