C# 通过lambda表达式传递属性,并对其属性进行排序

C# 通过lambda表达式传递属性,并对其属性进行排序,c#,generics,C#,Generics,我有一个ISomeType列表,其中T至少包含一个IConvertibleProperty类型的属性。例如: IConvertibleProperty { string PropertyA { get; set; } string PropertyB { get; set; } // etc } public class SomeTypeA : ISomeType { public ConvertibleProperty PropertyX { get; set

我有一个ISomeType列表,其中T至少包含一个IConvertibleProperty类型的属性。例如:

IConvertibleProperty
{
    string PropertyA { get; set; }
    string PropertyB { get; set; }
    // etc
}

public class SomeTypeA : ISomeType
{
    public ConvertibleProperty PropertyX { get; set; }
    // etc
}
我需要创建一个通用函数,可以通过以下方式调用该函数:

CustomMethod(list, x => x.PropertyX);
并将能够在其中实现下一个排序:

protected void CustomMethod<T, TKey>(IList<T> list, Func<T, TKey> expr) where T : ISomeType where TKey : IConvertibleProperty
{
    // example of non-generic sorting (in this case expr = x.PropertyX)
    var sortedList = list.OrderBy(x => x.PropertyX.PropertyA).ThenBy(x => x.PropertyX.PropertyB).ToList();

    // rest of the code
}
受保护的void CustomMethod(IList列表,Func expr),其中T:ISomeType,其中TKey:IConvertibleProperty
{
//非通用排序示例(在本例中,expr=x.PropertyX)
var sortedList=list.OrderBy(x=>x.PropertyX.PropertyA).ThenBy(x=>x.PropertyX.PropertyB.ToList();
//代码的其余部分
}

这可能吗?

我想您正在寻找:

var sortedList = list.OrderBy(x => expr(x).PropertyA)
                     .ThenBy(x => expr(x).PropertyB)
                     .ToList();

我想你在找这个:

var sortedList = list.OrderBy(x => expr(x).PropertyA)
                     .ThenBy(x => expr(x).PropertyB)
                     .ToList();
这很有效。把答案交给布罗格比尔德,因为这个答案首先在这里

protected List<T> CustomMethod<T, TKey>(IList<T> list, Func<T, TKey> expr) 
    where T : ISomeType where TKey : IConvertibleProperty
{
    var sortedList = list
        .OrderBy(x => expr(x).PropertyA)
        .ThenBy(x => expr(x).PropertyB).ToList<T>();
    return sortedList;
}
这很有效。把答案交给布罗格比尔德,因为这个答案首先在这里

protected List<T> CustomMethod<T, TKey>(IList<T> list, Func<T, TKey> expr) 
    where T : ISomeType where TKey : IConvertibleProperty
{
    var sortedList = list
        .OrderBy(x => expr(x).PropertyA)
        .ThenBy(x => expr(x).PropertyB).ToList<T>();
    return sortedList;
}