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)