我的案例值文本总是等于代码中的相关OSResultStruct“我现在已经实现它的方式并且正在工作”。例如,如果案例是osedition,那么属性是OSResultStruct.OSEdition。
是否可以执行下面的代码行?如果是这样,那么我可以用一行代码替换我的switch语句。
lstNewItems[i].sItemValue = OSresult.OSResultStruct."lstNewItems[i].sItemName.ToString().ToUpper()";
我的方式现在已经得到了启发并且正在发挥作用
switch (lstNewItems[i].sItemName)
{
case "osedition":
lstNewItems[i].sItemValue = OSresult.OSResultStruct.OSEdition;
break;
case "osbuild":
lstNewItems[i].sItemValue = OSresult.OSResultStruct.OSBuild;
break;
case "osmajor":
//.....
答案 0 :(得分:4)
不会缩短但是...你可以写和扩展methiod和属性。然后将该属性添加到每个枚举成员,并通过属性中的字符串解析它。这将使它成为一条线并可重复使用。
一些澄清的代码 - 正如我所说的那样不会很短:)
private static readonly Dictionary<DriveTrain, DriveTrainKind> DriveTrainKindMap =
Enums.GetValues<DriveTrain>().ToDictionary(d => d, d => d.GetDriveTrainKind());
[AttributeUsage(AttributeTargets.Field, AllowMultiple = false)]
public sealed class DriveTrainKindAttribute : Attribute
{
public DriveTrainKindAttribute(DriveTrainKind kind)
{
Kind = kind;
}
public DriveTrainKind Kind { get; private set; }
}
public static class ExtensionMethods
{
public static DriveTrainKind GetDriveTrainKind(this DriveTrain value)
{
var fieldInfo = typeof(DriveTrain).GetField(value.ToString());
var attributes = fieldInfo.GetCustomAttributes(typeof(DriveTrainKindAttribute), false)
.Cast<DriveTrainKindAttribute>();
return attributes.Select(a => a.Kind).SingleOrDefault();
}
}
public enum DriveTrainKind : byte
{
ConventionalOrHybrid = 0,
PluginHybrid = 1,
BatteryElectric = 2,
}
public enum DriveTrain : short
{
[Description("konv_otto"), DriveTrainKind(DriveTrainKind.ConventionalOrHybrid)]
ConventionalGasoline = 0,
[Description("konv_diesel"), DriveTrainKind(DriveTrainKind.ConventionalOrHybrid)]
ConventionalDiesel = 1,
...
}
答案 1 :(得分:2)
尝试反思: -
OSresult.OSResultStruct.GetType().GetProperty(lstNewItems[i].sItemName,BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance).GetValue(OSresult.OSResultStruct, null)
更通用的方法: -
定义扩展类: -
public static class ClassExtensions
{
public static TRes GetPublicPropertyValue<T,TRes>(this T queryObject, string propertyMatch)
where T : class,new()
where TRes : new()
{
return (TRes)typeof(T).GetProperty(propertyMatch, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance).GetValue(queryObject, null);
}
}
将其用于任何可实例化的类型,如下所示: -
OSresult.OSResultStruct.GetPublicPropertyValue<yourtype,yourreturntype>(attribName);
答案 2 :(得分:1)
你可以按名称使用反射 - 获取属性访问器(Type.GetProperty)(当你的名字似乎全是小写时,你需要指定IgnoreCase)而不是{{3使用访问器的属性。