Výčty (enum) různých typů jako parametr   zodpovězená otázka

C#

Dobrý den,

nedaří se mi přijít na řešení následujícího problému. Tuším, že řešení nebude buď žádné a nebo se bude skrývat v generických typech, ale své možnosti už jsem bohužel vyčerpal.

Ve své aplikaci mám mnoho různých výčtů, které dědí v vždy z jednoho z celočíselných datových typů (byte, short, int...).

Výčty jsem zvolil proto, že metoda console.writeline standardně vytiskne jejich název místo číselné hodnoty, což je situace, kterou potřebuji nejčastěji a v případě použití konstant by to bylo složitější.

Nyní se ale snažím napsat univerzální metodu, která vytiskne jejich číselnou podobu v HEX podobě, s počtem znaků dle jejich "base typu."

Čili např.:

Console.Write("{0:X2}h", val)

pro byte

nebo

Console.Write("{0:X4}h", val)

pro short, atd

Zatím mne nenapadá jiné řešení než použít jednu přetíženou metodu, pro každý jednotlivý výčet a nebo mít vstupní parametr metody typu object a přetypovat na správný typ už před vložením parametru (což předpokládá znalost typu každého z enumů).

Napadá prosím někoho nějaké elegantnější řešení?

Děkuji

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pokud bychom se bavili o konstantách, pak řešení mohlo být např toto:

        public static void PrintHex(object val)
        {
            if (val is byte)
            {
                Console.Write("{0:X2}h", val);
            }
            else if ((val is short) || (val is ushort))
            {
                Console.Write("{0:X4}h", val);
            }
            // atd pro další typy
            else
            {
                Console.Write("Unsupported type: {0}, Value: {1}", val.GetType(), val);
            }
        }

Ale zde hodnotu výčtového typu vložit nemohu...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Lépe by se hledalo řešení, kdyby jste zadal nějaké příklady vstupu a očekávaného výstupu. Nicméně, nedělá následující kód přesně to, co chcete?

void Print(Enum value)
{
    Console.Write("{0:X}", value);
}
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Máte samozřejmě pravdu :)

Ale, hledal jsem univerzální metodu, do které mohu vložit NEJEN enum, vyřeším to prostě asi přetíženou metodou podobnou tomuto:

        public static void print(Enum value)
        {
            Console.WriteLine("{0:X}h", value);
        }

        public static void print(object x)
        {
                switch (Type.GetTypeCode(x.GetType()))
                {
                    case TypeCode.Byte:
                    case TypeCode.SByte:
                        Console.WriteLine("{0:X2}h", x);
                        break;
                    case TypeCode.Int16:
                    case TypeCode.UInt16:
                    case TypeCode.Char:
                        Console.WriteLine("{0:X4}h", x);
                        break;
                    case TypeCode.Int32:
                    case TypeCode.UInt32:
                        Console.WriteLine("{0:X8}h", x);
                        break;
                    case TypeCode.Int64:
                    case TypeCode.UInt64:
                        Console.WriteLine("{0:X16}h", x);
                        break;
                    default:
                        Console.WriteLine("Unsupported type: {0}, Value: {1}", x.GetType(), x);
                        break;

                }

({0:X2}, val) reprezentuje i Byte nebo Short v délce Integeru a to nechci a zároveň nemohu metodě s parametrem typu objekt předat Enum, aby to fungovalo stejně....

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback