Jak zwrócić określony słownik w metodzie generycznej w zależności od typu generycznego?

0

Witam. Tworze sobie słowniki enumeratorów i stwierdziłem, że bardzo wygodnie będzie je opakować w dwie metody:

  1. Pobieranie tłumaczenia wartości tekstowej dla wartości enum
  2. Pobieranie listy wszystkich wartości enum wraz z ich tekstowymi odpowiednikami
public interface IEnumTranslationService
    {
        string TranslateEnum<T>(T value);
        Dictionary<T, string> GetValues<T>();
    }

Dla pierwszego zrobiłem coś takiego:

public string TranslateEnum<T>(T value)
        {
            Type t = value.GetType();

            if (t == typeof(eTypeOfDrive))
                return TypeOfDriveNames[Enum.Parse<eTypeOfDrive>(value.ToString())];
            if (t == typeof(eVehicleMarkingType))
                return VehicleMarkingTypeNames[Enum.Parse<eVehicleMarkingType>(value.ToString())];
            if (t == typeof(eFuelType))
                return FuelTypeNames[Enum.Parse<eFuelType>(value.ToString())];
            if (t == typeof(eUnitOfFuel))
                return UnitOfFuelNames[Enum.Parse<eUnitOfFuel>(value.ToString())];
            if (t == typeof(eOdometerUnit))
                return OdometerUnitNames[Enum.Parse<eOdometerUnit>(value.ToString())];
            throw new NotImplementedException("Nie znaleziono słownika dla podanego typu");
        }

jednak mam problem z zaimplementowaniem drugiej metody, ponieważ jak poprawnie wykryć typ i zwrócić odpowiedni słownik. Pomoglibyście?

public Dictionary<eTypeOfDrive, string> TypeOfDriveNames = new Dictionary<eTypeOfDrive, string>()
        {
            { eTypeOfDrive.Petrol, "Benzyna" },
            { eTypeOfDrive.Diesel, "Diesel" },
        };
        public Dictionary<eVehicleMarkingType, string> VehicleMarkingTypeNames = new Dictionary<eVehicleMarkingType, string>()
        {
            { eVehicleMarkingType.NotMarked, "Nieoznakowany" },
            { eVehicleMarkingType.Marked, "Oznakowany" },
        };
        public Dictionary<eFuelType, string> FuelTypeNames = new Dictionary<eFuelType, string>()
        {
            { eFuelType.Petrol, "Benzyna" },
            { eFuelType.Diesel, "Diesel" },
            { eFuelType.Hybrid, "Hybryda" },
            { eFuelType.Electric, "Elektryk" },
            { eFuelType.Gas, "Gaz" },
        };
        public Dictionary<eUnitOfFuel, string> UnitOfFuelNames = new Dictionary<eUnitOfFuel, string>()
        {
            { eUnitOfFuel.Liters, "Litry" },
            { eUnitOfFuel.Kilograms, "Kilogramy" },
            { eUnitOfFuel.CubicDecimeters, "Decymetry sześcienne" },
        };
        public Dictionary<eOdometerUnit, string> OdometerUnitNames = new Dictionary<eOdometerUnit, string>()
        {
            { eOdometerUnit.Kilometers, "Kilometry" },
            { eOdometerUnit.Miles, "Mile" },
            { eOdometerUnit.NauticalMiles, "Mile morskie" },
        };

public Dictionary<T, string> GetValues<T>()
        {
            if (T.GetType() == typeof(eTypeOfDrive))
                return TypeOfDriveNames;
            if (T == typeof(eVehicleMarkingType))
                return VehicleMarkingTypeNames;
            if (T == typeof(eFuelType))
                return FuelTypeNames;
            if (T == typeof(eUnitOfFuel))
                return UnitOfFuelNames;
            if (T == typeof(eOdometerUnit))
                return OdometerUnitNames;
        }
0

Dzięki Wam skróciłem kod do:

@foreach (var fuelType in Enum.GetValues<eFuelType>())
{
  <option value="@fuelType">@fuelType.ToName()</option>
}

Jesteście wielcy!

1 użytkowników online, w tym zalogowanych: 0, gości: 1