C#Linq OrderBy反射。去离子串

C#Linq OrderBy反射。去离子串,c#,linq,reflection,C#,Linq,Reflection,我需要在order by中使用分隔字符串。例如“产品参考” 我似乎遇到了问题,因为结果的顺序与调用该方法之前相同 例如,我有一个xUnit测试,它显示了我的问题。 这些断言表明订单仍然相同 编辑: 明确地说,我不是在测试orderby,而是在测试方法PathToProperty。 本测试仅用于演示目的 从测试中可以看出,我在方法私有静态对象路径属性(object t,string path)中使用反射,所以我假设我在这里做错了什么 使用系统; 使用System.Collections.Gener

我需要在order by中使用分隔字符串。例如“产品参考”

我似乎遇到了问题,因为结果的顺序与调用该方法之前相同

例如,我有一个xUnit测试,它显示了我的问题。 这些断言表明订单仍然相同

编辑:
明确地说,我不是在测试orderby,而是在测试方法PathToProperty。 本测试仅用于演示目的

从测试中可以看出,我在方法
私有静态对象路径属性(object t,string path)
中使用反射,所以我假设我在这里做错了什么

使用系统;
使用System.Collections.Generic;
使用System.Linq;
运用系统反思;
使用Xunit;
命名空间Pip17PFinanceApi.Tests.Workers
{
公共类InputViewModel
{
公共列表OrderViewModels{get;set;}
}
公共类OrderViewModel
{
公共产品产品{get;set;}
公共十进制价格{get;set;}
}
公共类产品
{
公共字符串说明{get;set;}
公共字符串引用{get;set;}
}
公共类OrderByWithReflection
{
[事实]
public void OrderByTest()
{
//阿兰奇
var模型=新的InputViewModel
{
OrderViewModels=新列表
{
新OrderViewModel{
产品=新产品
{
Reference=“02”
}
},
新OrderViewModel{
产品=新产品
{
Reference=“03”
}
},
新OrderViewModel{
产品=新产品
{
Reference=“01”
}
},
新OrderViewModel{
产品=新产品
{
Reference=“04”
}
},
}
};
//表演
var query=model.OrderViewModels.OrderBy(t=>PathTopProperty(t,“Product.Reference”);
var result=query.ToList();
//断言
Assert.Equal(“01”,结果[0].Product.Reference);
Assert.Equal(“02”,结果[1].Product.Reference);
Assert.Equal(“03”,结果[2].Product.Reference);
Assert.Equal(“04”,结果[3]。Product.Reference);
}
私有静态对象路径属性(对象t,字符串路径)
{
类型currentType=t.GetType();
foreach(path.Split('.')中的字符串propertyName)
{
PropertyInfo属性=currentType.GetProperty(propertyName);
t=财产;
currentType=property.PropertyType;
}
返回t;
}
}
}

您的
路径属性
不正确。想想它的返回值——上次通过时,您设置了
t=property
,然后返回
t
。但是
property
是一个
PropertyInfo
,所以您只是比较
OrderBy
中的相同对象

我使用了一种类似的扩展方法:

public static object GetPropertyPathValue(this object curObject, string propsPath) {
    foreach (var propName in propsPath.Split('.'))
        curObject = curObject.GetType().GetProperty(propName).GetValue(curObject);

    return curObject;
}
如果用于代替
PathTopProperty
方法,则
OrderBy
将起作用

var query = model.OrderViewModels.OrderBy(t => t.GetPropertyPathValue("Product.Reference"));
您可以将方法更新为类似以下内容:

private static object PathToProperty(object curObject, string path) {
    foreach (string propertyName in path.Split('.')) {
        var property = curObject.GetType().GetProperty(propertyName);
        curObject = property.GetValue(curObject);
    }
    return curObject;
}
为了同样的结果

实际上,使用一些其他扩展方法和LINQ,我的普通方法处理属性或字段:

public static object GetPathValue(this object curObject, string memberPath)
    => memberPath.Split('.').Aggregate(curObject, (curObject, memberName) => curObject.GetType().GetPropertyOrField(memberName).GetValue(curObject));

这回答了你的问题吗?抱歉,我不明白您为什么要测试OrderBy的行为?该方法来自.net,并由他们进行了测试。或者您的产品将对ViewModel条目进行排序?在这种情况下,您必须调用一些API对ViewModel进行排序,并在测试中验证结果。您的测试似乎表明
OrderBy
正在工作,除非
Assert
s正在抛出…如果顺序相同,
Assert
s必须是`Assert.Equal(“02”,结果[0].Product.Reference); Assert.Equal(“03”,结果[1].Product.Reference);Assert.Equal(“01”,结果[2]。Product.Reference);Assert.Equal(“04”,结果[3]。Product.Reference)`明确地说,我不是在测试orderby,而是在测试方法PathToProperty。实际上,测试只是一个问题的演示。这太完美了,谢谢。最后我放弃了我的版本,使用了你的扩展方法。