C# 如何创建用于填充列表的通用方法<;选择列表项>;是否具有指定的模型属性?

C# 如何创建用于填充列表的通用方法<;选择列表项>;是否具有指定的模型属性?,c#,linq,generics,C#,Linq,Generics,作为通用存储库的一部分,我正在尝试创建一个通用方法,用指定属性的值填充SelectListItems列表 我想创建如下内容: public List<SelectListItem> AllAsSelectListItemsSpecifyProperties(Expression<Func<T, string>> valueProperty, Expression<Func<T, string>> textProperty, string

作为通用存储库的一部分,我正在尝试创建一个通用方法,用指定属性的值填充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();
}

更新

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

下面的答案给出了一个如下的返回对象:

List<SelectListItem>(){
    {Value: "ID", Text: "Name", Selected: true},
    {Value: "ID", Text: "Name", Selected: false},
    {Value: "ID", Text: "Name", Selected: false}
};
List(){
{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();
}
public List AllAsSelectListItemsSpecifyProperties(Expression-valueProperty、Expression-textProperty、string-selectedValue=”“)
{
返回AllAsQueryable().Select(i=>newselectListItem())
{
Value=GetPropertyValue(valueProperty),
Text=GetPropertyValue(textProperty),
Selected=(selectedValue==valueProperty)
})
.ToList();
}
私有字符串GetPropertyValue(表达式)
{
返回表达式.Compile()(this.ToString();
}

您可以编写如下所示的方法,从Expression to create列表中获取值

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();
}
public List AllAsSelectListItemsSpecifyProperties(Expression-valueProperty、Expression-textProperty、string-selectedValue=”“)
{
返回AllAsQueryable().Select(i=>newselectListItem())
{
Value=GetValue(valueProperty.Body作为MemberExpression).ToString(),
Text=GetValue(textProperty.Body作为MemberExpression).ToString(),
Selected=(selectedValue==valueProperty)
})
.ToList();
}
私有对象GetValue(MemberExpression成员)
{
var objectMember=Expression.Convert(成员,typeof(对象));
var getterLambda=Expression.Lambda(objectMember);
var getter=getterLambda.Compile();
返回getter();
}

既然您正在执行valueProperty.ToString(),那么
AllAsQueryable()的类型是什么?
?1)这就是为什么您将值获取为“m.ID.ToString()”作为valueProperty作为valueProperty作为表达式而不是原始数据类型或对象。2) 如果您可以将实现更改为
Expression valueProperty
,那么它将是泛型的,并且在编译和计算表达式后,您可以获得实际的数据类型,这将解决您的问题2.AllAsQueryable将是泛型存储库中的
IQueryable
,感谢您花时间回答。对不起,我想我可能不清楚预期的结果,或者做错了什么。选择选项提供的是属性的名称,而不是值。我更新了问题,让它更清楚。谢谢你的回答。对不起,我可能不清楚。我希望用属性值而不是名称填充选择列表项。我已经更新了问题以使其更清楚。@MartinHansenLennox好的,我更改了答案以解决您的问题。@MartinHansenLennox欢迎您,我很高兴帮助您!
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();
}
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();
}