如何创建一个通用方法来填充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");
}
希望结果:
我希望上面的用法返回SelectListItems
的List<>
,例如:
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}
};
我想做的事情有可能吗?如果有,有人会指出我做错了什么吗
要使用表达式获取属性值,您可以编译表达式,然后您将有一个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();
}