0

我的案例值文本始终等于代码中的相关 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":    
          //.....
4

3 回答 3

4

不会更短,但是...您可以编写和扩展方法和属性。然后将该属性添加到每个枚举成员,并通过属性中的字符串解析它。这将使它成为一条线并且可重复使用。

一些用于澄清的代码——正如我所说的,它不会很短:)

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,
    ...
}
于 2013-03-26T02:17:01.277 回答
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);
于 2013-03-26T02:14:39.120 回答
1

您可以使用反射 - 按名称获取属性访问器(Type.GetProperty)(获取时需要指定IgnoreCase,因为您的名称似乎都是小写),而不是使用访问器获取属性的GetValue

于 2013-03-26T02:16:05.657 回答