0

私のケース値のテキストは、「現在実装して機能している方法」のコード内の関連するOSResultStructと常に同じです。たとえば、ケースがoseditionの場合、プロパティはOSResultStruct.OSEditionです。

以下のコード行のようなことをすることは可能ですか?もしそうなら、switchステートメントを1行のコードに置き換えることができます。

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

短くなることはありませんが...メチオドと属性を記述して拡張することができます。次に、その属性を各列挙型メンバーに追加し、属性からの文字列によって解決しました。これにより、1行で再利用できるようになります。

明確にするためのいくつかのコード-私が言ったように、それは短くなることはないでしょう:)

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 に答える