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。这看起来比我在案例数量较少的情况下所做的要好一些