替换switch语句 - 通过字符串名称获取属性

Ben*_*Ben 0 c# wpf switch-statement

基本上,我有一个系统,我的datagrid标记已更改为新背景颜色的单元格,为此我在对象中有一个方法,包含这些属性,接收一个字符串,这是要检查的属性的名称,然后是一个switch语句,它接受该字符串来检查正确的属性.

public Color HasChanged(string value)
{
    switch (value)
    {
        case "CILRef":
            if (_localShipment.cilRef != _originalShipment.cilRef)
            {
                return Colors.SkyBlue;
            }
            else
            {
                return Colors.White;
            }
        case "ArrivedAtPortDate":
            if (_localShipment.arrivedAtPortDate != _originalShipment.arrivedAtPortDate)
            {
                return Colors.SkyBlue;
            }
            else
            {
                return Colors.White;
            }
    }
}
Run Code Online (Sandbox Code Playgroud)

为简洁起见,我删除了其余的属性.

现在我有一种唠叨的感觉,有一种更简洁的方法来做这个字符串>属性而不使用switch语句,但我不能在我的生活中找到谷歌的任何东西,很难搜索没有一些关键字继续下去.

我也试图只保存那些已更改的属性,我将任何已更改的属性名称放入一个数组中,然后使用另一个switch语句循环检查该数组,然后保存正确的属性.然而,这对我来说再次显得不整齐.

是否有一个更清晰的解决方案,希望可以处理添加新属性,而无需向switch语句添加新代码.

如果需要,我可以包括执行此检查的其余代码(即数据网格上的WPF绑定,以及使用属性名称作为字符串参数调用检查方法的转换器).

EZI*_*EZI 6

您可以编写一个扩展方法,如:

public static object GetPropValue(this object o, string propName)
{
    return o.GetType().GetProperty(propName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.IgnoreCase)
            .GetValue(o);
}
Run Code Online (Sandbox Code Playgroud)

并使用它

if(localShipment.GetPropValue(value).Equals(originalShipment.GetPropValue(value)))
{
}
Run Code Online (Sandbox Code Playgroud)