public DefaultTypeConvertorGenerator()
{
var convConvertibleTypes = new[]
{
typeof (byte), typeof (sbyte), typeof (ushort), typeof (short),
typeof (uint), typeof (int), typeof (ulong), typeof (long),
typeof (float), typeof (double)
};
AddConversions(convConvertibleTypes, typeof(long), ilg => ilg.ConvI8());
AddConversions(convConvertibleTypes, typeof(ulong), ilg => ilg.ConvU8());
AddConversions(convConvertibleTypes, typeof(int), ilg => ilg.ConvI4());
AddConversions(convConvertibleTypes, typeof(uint), ilg => ilg.ConvU4());
AddConversions(convConvertibleTypes, typeof(short), ilg => ilg.ConvI2());
AddConversions(convConvertibleTypes, typeof(ushort), ilg => ilg.ConvU2());
AddConversions(convConvertibleTypes, typeof(sbyte), ilg => ilg.ConvI1());
AddConversions(convConvertibleTypes, typeof(byte), ilg => ilg.ConvU1());
AddConversions(convConvertibleTypes, typeof(double), ilg => ilg.ConvR8());
AddConversions(convConvertibleTypes, typeof(float), ilg => ilg.ConvR4());
foreach (var m in GetType().GetMethods())
{
if (!m.IsStatic) continue;
if (!m.IsPublic) continue;
if (!m.Name.StartsWith("Convert", StringComparison.Ordinal)) continue;
if (m.ContainsGenericParameters) continue;
var parameterInfos = m.GetParameters();
if (parameterInfos.Length != 1) continue;
var fromType = parameterInfos[0].ParameterType;
var closuredMethodInfo = m;
_conversions[Tuple.Create(fromType, m.ReturnType)] = ilg => ilg.Call(closuredMethodInfo);
}
}