c#消除了交换机要求

时间:2013-03-26 02:11:18

标签: c# object switch-statement

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

3 个答案:

答案 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使用访问器的属性。