\

Školení Návrhové vzory, OOP a UML


 Friday, April 18, 2008
Existuje konverze na typ int? A jsme schopni detekovat existenci konverze za běhu aplikace?

Na builderu padl dotaz, jak za běhu aplikace zjistit, zda lze nějaký typ konvertovat na int a přitom zohlednit i uživatelské konverze. Sice nevím, k čemu by se dala informace využít:), když už si  kompilátor "jen to své" u konverzí řekl - užitečnost informace je srovnatelná s užitečnosti permanentky do harému obdržené post mortem. (Kvazi)problém se dá částečně vyřešit s využitím podivných hacků. Přesto dávám kód sem s vírou, že někdo vymyslí něco lepšího, nebo mi alespoň sdělí, k čemu by se taková informace dala využít. A per analogiam se tak vyřeší i trýznivá aporie (ne)obdržené permanentky. :)

static class TypeExtensions
    {
         public static bool HasToIntConversion(Type type)
         {
        
                 Type intType = typeof(int);
                 Type currentType = type;
                    
                 Type[] floatTypes = {typeof(float), typeof(double), typeof(decimal)};
                 if (currentType.IsPrimitive||
                     currentType.IsEnum ||
                     Array.IndexOf(floatTypes, currentType) >= 0)
                   
                {
                    return true;
                }

                
                else
                {

                    foreach (MethodInfo info in currentType.GetMethods())
                    {
                        Console.WriteLine(info.Name);
                        if (info.Name.Contains("op_Implicit") || info.Name.Contains("op_Explicit"))
                        {
                            if (info.ReturnType.Equals(intType))
                            {
                                return true;
                            }
                        }
                        
                    }

                }

                return false;
            }
        
             
        public static bool HasToIntConversion(this object obj)
        {
            return HasToIntConversion(obj.GetType());           

        }
    
        public static bool HasToIntConversion<T>()
        {
            return HasToIntConversion(typeof(T));
        }
            
    }

Použití je jednoduché:

 

class ConvertibleToInt
    {
        private int x=5;
        
        
        public ConvertibleToInt()
        {

        }
    
        public static implicit operator int(ConvertibleToInt instance)
        {
            if (instance == null)
            {
                throw new InvalidCastException();
            }
            
            return instance.x;
        }

    }


    class ExplicitConvertibleToInt
    {
        private int x = 5;


        public ExplicitConvertibleToInt()
        {

        }

        public static explicit operator int(ExplicitConvertibleToInt instance)
        {
            if (instance == null)
            {
                throw new InvalidCastException();
            }

            return instance.x;
        }

    }

class Program
    {
        static void Main(string[] args)
        {

            ConvertibleToInt conv = new ConvertibleToInt();
            Console.WriteLine(conv.HasToIntConversion());
            
            
            Console.WriteLine(TypeExtensions.HasToIntConversion<short>());
            Console.WriteLine(TypeExtensions.HasToIntConversion<decimal>());
            Console.WriteLine(TypeExtensions.HasToIntConversion(5));


            Console.WriteLine(TypeExtensions.HasToIntConversion<ConvertibleToInt>());
            Console.WriteLine(TypeExtensions.HasToIntConversion<ExplicitConvertibleToInt>());
            
            Console.ReadLine();
            
        }
}


Friday, April 18, 2008 4:56:38 PM (Central Europe Standard Time, UTC+01:00)       
Comments [5]