如何创建一个通用方法来填充List<;选择列表项>;具有指定的模型属性

本文关键字:gt 选择 列表 模型 属性 lt List 创建 何创建 一个 填充 | 更新日期: 2023-09-27 18:26:53

作为通用存储库的一部分,我正在尝试创建一个通用方法,该方法将用指定属性的值填充SelectListItems列表。

我想创建这样的东西:

public List<SelectListItem> AllAsSelectListItemsSpecifyProperties(Expression<Func<T, string>> valueProperty, Expression<Func<T, string>> textProperty, string selectedValue = "")
{
    return AllAsQueryable().Select(i => new SelectListItem()
    {
        Value = valueProperty.ToString(),
        Text = textProperty.ToString(),
        Selected = (selectedValue == valueProperty)
    })
    .ToList();
}

用法:

public List<SelectListItem> People()
{
    return AllAsSelectListItemsSpecifyProperties(m => m.ID, m => m.Name, "Ted");
}

希望结果:

我希望上面的用法返回SelectListItemsList<>,例如:

List<SelectListItem>(){
    {Value: "1", Text: "Ted", Selected: true},
    {Value: "2", Text: "Sam", Selected: false},
    {Value: "3", Text: "Tracy", Selected: false}
};

更新

我想我可能不清楚。或者可能做错了什么。

下面的答案是返回一个像这样的对象:

List<SelectListItem>(){
    {Value: "ID", Text: "Name", Selected: true},
    {Value: "ID", Text: "Name", Selected: false},
    {Value: "ID", Text: "Name", Selected: false}
};

我想做的事情有可能吗?如果有,有人会指出我做错了什么吗

如何创建一个通用方法来填充List<;选择列表项>;具有指定的模型属性

要使用表达式获取属性值,您可以编译表达式,然后您将有一个Func,您可以执行该Func来获取值,如下所示:

public List<SelectListItem> AllAsSelectListItemsSpecifyProperties(Expression<Func<T, string>> valueProperty, Expression<Func<T, string>> textProperty, string selectedValue = "")
{
    return AllAsQueryable().Select(i => new SelectListItem()
    {
        Value = GetPropertyValue(valueProperty),
        Text = GetPropertyValue(textProperty),
        Selected = (selectedValue == valueProperty)
    })
    .ToList();
}
private string GetPropertyValue(Expression<Func<T, string>> expression)
{
    return expression.Compile()(this).ToString();
}

您可以编写如下所示的方法,从Expression中获取值以创建List。

public List<SelectListItem> AllAsSelectListItemsSpecifyProperties(Expression<Func<T, string>> valueProperty, Expression<Func<T, string>> textProperty, string selectedValue = "")
{
    return AllAsQueryable().Select(i => new SelectListItem()
    {
        Value = GetValue(valueProperty.Body as MemberExpression).ToString(),
        Text = GetValue(textProperty.Body as MemberExpression).ToString(),
        Selected = (selectedValue == valueProperty)
    })
    .ToList();
}

private object GetValue(MemberExpression member)
{
    var objectMember = Expression.Convert(member, typeof(object));
    var getterLambda = Expression.Lambda<Func<object>>(objectMember);
    var getter = getterLambda.Compile();
    return getter();
}