C# 扩展方法对父对象中的列表进行排序 公共类人物 { 公共字符串名称{get;set;} 公共电子邮件{get;set;} } 公共类电子邮件 { 公共字符串desc{get;set;} } 公共静态IEnumerable排序(此IEnumerable源、字符串sortExpression、bool desc) { var param=Expression.Parameter(typeof(T),string.Empty); 尝试 { var property=Expression.property(param,sortExpression); var sortLambda=Expression.Lambda(Expression.Convert(property,typeof(object)),param); 如果(描述) { 返回source.AsQueryable().OrderByDescending(sortLambda); } 返回source.AsQueryable().OrderBy(sortLambda); } 捕获(异常) { 返回源; } } List vet=新列表(); 人员p=新人员{name=“aaa”,电子邮件=新电子邮件{desc=”bbb@aaa.com" } }; Person pp=new Person{name=“bbb”,email=new email{desc=”aaa@aaa.com" } }; 兽医添加(p); 审核添加(pp); 检查排序(“名称”,正确)//作品 vet.Sort(“email.desc”,true)//不起作用

C# 扩展方法对父对象中的列表进行排序 公共类人物 { 公共字符串名称{get;set;} 公共电子邮件{get;set;} } 公共类电子邮件 { 公共字符串desc{get;set;} } 公共静态IEnumerable排序(此IEnumerable源、字符串sortExpression、bool desc) { var param=Expression.Parameter(typeof(T),string.Empty); 尝试 { var property=Expression.property(param,sortExpression); var sortLambda=Expression.Lambda(Expression.Convert(property,typeof(object)),param); 如果(描述) { 返回source.AsQueryable().OrderByDescending(sortLambda); } 返回source.AsQueryable().OrderBy(sortLambda); } 捕获(异常) { 返回源; } } List vet=新列表(); 人员p=新人员{name=“aaa”,电子邮件=新电子邮件{desc=”bbb@aaa.com" } }; Person pp=new Person{name=“bbb”,email=new email{desc=”aaa@aaa.com" } }; 兽医添加(p); 审核添加(pp); 检查排序(“名称”,正确)//作品 vet.Sort(“email.desc”,true)//不起作用,c#,list,sorting,C#,List,Sorting,有人可以帮我吗?您可能需要考虑另一种方法,该方法使用自定义比较器对象进行比较。然后,您可以为用户编写一个自定义比较器,根据他们的电子邮件地址进行比较。如果需要此功能,请查看ScottGu在网站上的文章。我相信它会满足你的要求 虽然Lambda是类型安全的,但有时您可能希望动态生成查询,而不是使用用户可以排序的所有可能的组合 编辑 我修正了你的方法。基本上,您需要为每个成员访问创建一个表达式 public class Person { public string name { get; s

有人可以帮我吗?

您可能需要考虑另一种方法,该方法使用自定义比较器对象进行比较。然后,您可以为用户编写一个自定义比较器,根据他们的电子邮件地址进行比较。

如果需要此功能,请查看ScottGu在网站上的文章。我相信它会满足你的要求

虽然Lambda是类型安全的,但有时您可能希望动态生成查询,而不是使用用户可以排序的所有可能的组合

编辑

我修正了你的方法。基本上,您需要为每个成员访问创建一个表达式

public class Person
{
    public string name { get; set; }
    public Email email { get; set; }

}

public class Email
{
    public string desc { get; set; }
}

public static IEnumerable<T> Sort<T>(this IEnumerable<T> source, string sortExpression, bool desc)
{            
    var param = Expression.Parameter(typeof(T), string.Empty);
    try
    {
        var property   = Expression.Property(param, sortExpression);
        var sortLambda = Expression.Lambda<Func<T, object>>(Expression.Convert(property, typeof(object)), param);

        if (desc)
        {
            return source.AsQueryable<T>().OrderByDescending<T, object>(sortLambda);
        }

        return source.AsQueryable<T>().OrderBy<T, object>(sortLambda);
    }
    catch (ArgumentException)
    {
        return source;
    }
}

        List<Person> vet = new List<Person>();

        Person p = new Person { name = "aaa", email = new Email { desc = "bbb@aaa.com" } };
        Person pp = new Person { name = "bbb", email = new Email { desc = "aaa@aaa.com" } };
        vet.Add(p);
        vet.Add(pp);

        vet.Sort("name",true); //works
        vet.Sort("email.desc",true) // doesnt work
公共静态IEnumerable排序(此IEnumerable源代码,字符串sortExpression,bool desc)
{
var param=Expression.Parameter(typeof(T),string.Empty);
尝试
{
var fields=sortExpression.Split('.');
表达式属性=null;
表达式parentParam=param;
foreach(字段中的变量字段)
{
property=Expression.property(parentParam,field);
parentParam=属性;
}
变量sortLambda=
Lambda(
Expression.Convert(property,typeof(object)),param);
如果(描述)
{
返回source.AsQueryable()。
OrderByDescending(sortLambda);
}
返回source.AsQueryable()。
订购人(索特拉姆达);
}
捕获(异常)
{
投掷;
}
}
 public static IEnumerable<T> Sort<T>(this IEnumerable<T> source, string sortExpression, bool desc)
    {
        var param = Expression.Parameter(typeof(T), string.Empty);
        try
        {
            var fields = sortExpression.Split('.');
            Expression property = null;
            Expression parentParam = param;
            foreach (var field in fields)
            {
                property = Expression.Property(parentParam, field);
                parentParam = property;

            }

            var sortLambda = 
                Expression.Lambda<Func<T, object>>(
                  Expression.Convert(property, typeof(object)), param);

            if (desc)
            {
                return source.AsQueryable<T>().
                     OrderByDescending<T, object>(sortLambda);
            }

            return source.AsQueryable<T>().
                 OrderBy<T, object>(sortLambda);
        }
        catch (ArgumentException)
        {
            throw;
        }
    }