C# 如何有效地检索具有与属性名类似的命名字符串的特定类属性值

C# 如何有效地检索具有与属性名类似的命名字符串的特定类属性值,c#,object,C#,Object,下面是一个示例的类结构 public class ColorStuff { public Red Red { get; set; } public Green Green { get; set; } public Blue Blue { get; set; } } public class Red { public string Id { get; s

下面是一个示例的类结构

public class ColorStuff
        {
            public Red Red { get; set; }
            public Green Green { get; set; }
            public Blue Blue { get; set; }
        }

public class Red
        {
            public string Id { get; set; }
        }

public class Green
        {
            public string Id { get; set; }
        }

public class Blue
        {
            public string Id { get; set; }
        }
public string GetColorIdByName(string colorName)
        {
            var colorSettings = JsonConvert.DeserializeObject<ColorStuff>(content);
            string colorId = string.Empty;
            switch (colorName)
            {
                case "Red":
                    colorId = colorSettings.Red.Id;
                    break;
                case "Green":
                    colorId = colorSettings.Green.Id;
                    break;
                case "Blue":
                    colorId = colorSettings.Blue.Id;
                    break;
            }

            return colorId;
        }
我有一个方法,如下所示,通过颜色名称检索颜色Id,如下所示

public class ColorStuff
        {
            public Red Red { get; set; }
            public Green Green { get; set; }
            public Blue Blue { get; set; }
        }

public class Red
        {
            public string Id { get; set; }
        }

public class Green
        {
            public string Id { get; set; }
        }

public class Blue
        {
            public string Id { get; set; }
        }
public string GetColorIdByName(string colorName)
        {
            var colorSettings = JsonConvert.DeserializeObject<ColorStuff>(content);
            string colorId = string.Empty;
            switch (colorName)
            {
                case "Red":
                    colorId = colorSettings.Red.Id;
                    break;
                case "Green":
                    colorId = colorSettings.Green.Id;
                    break;
                case "Blue":
                    colorId = colorSettings.Blue.Id;
                    break;
            }

            return colorId;
        }
公共字符串GetColorIdByName(字符串colorName)
{
var colorSettings=JsonConvert.DeserializeObject(内容);
string colorId=string.Empty;
开关(颜色名称)
{
案例“红色”:
colorId=colorSettings.Red.Id;
打破
案例“绿色”:
colorId=colorSettings.Green.Id;
打破
案例“蓝色”:
colorId=colorSettings.Blue.Id;
打破
}
返回colorId;
}
正如您所看到的,对于每个颜色名称,我必须创建一个开关盒。在没有多个开关盒的情况下,我还能打电话吗


例如,如果我想检索“Green”的颜色Id,我将访问“Green”类及其相关属性。除了保留单独的开关盒,还有其他有效的方法来实现这一点吗?

您可以使用反射来实现这一目的。比如说,

var color = GetPropertyValue(colorSettings, colorName);
var id = GetPropertyValue(color, "Id");

其中
GetPropertyValue
定义为

public object GetPropertyValue(object instance ,string propertyName)
{
    var objType = instance.GetType();
    var prop = objType.GetProperty(propertyName);
    return prop.GetValue(instance, null);
}

您可以使用反射,但坦率地说,
开关
可读性更强,效率更高;我要做的主要更改是在C#8中使用一个“开关表达式”:return colorName开关{“Red”=>colorSettings.Red.Id,“Green”=>colorSettings.Green.Id,“Blue”=>colorSettings.Blue.Id,=>“}——尽管我可能也会更改为所有3个都使用相同的类型(显示的代码中不需要单独的
红色
/
绿色
/
蓝色
类型(我也可以使用
名称
,但是…meh)谢谢@MarcGravel。这看起来比我在案例数量较少的情况下所做的要好一些