public static Type FindIEnumerable(Type seqType) { Type result; if (seqType == null || seqType == typeof(string)) { result = null; } else if (seqType.IsArray) { result = typeof(IEnumerable <>).MakeGenericType(new Type[] { seqType.GetElementType() }); } else { if (seqType.IsGenericType) { Type[] array = seqType.GetGenericArguments(); for (int i = 0; i < array.Length; i++) { Type type = array[i]; Type type2 = typeof(IEnumerable <>).MakeGenericType(new Type[] { type }); if (type2.IsAssignableFrom(seqType)) { result = type2; return(result); } } } Type[] interfaces = seqType.GetInterfaces(); if (interfaces != null && interfaces.Length > 0) { Type[] array = interfaces; for (int i = 0; i < array.Length; i++) { Type seqType2 = array[i]; Type type2 = AiTypeHelper.FindIEnumerable(seqType2); if (type2 != null) { result = type2; return(result); } } } if (seqType.BaseType != null && seqType.BaseType != typeof(object)) { result = AiTypeHelper.FindIEnumerable(seqType.BaseType); } else { result = null; } } return(result); }
public static object GetDefault(Type type) { object result; if (type.IsValueType && !AiTypeHelper.IsNullableType(type)) { result = Activator.CreateInstance(type); } else { result = null; } return(result); }
public static Type GetNonNullableType(Type type) { Type result; if (AiTypeHelper.IsNullableType(type)) { result = type.GetGenericArguments()[0]; } else { result = type; } return(result); }
public static Type GetElementType(Type seqType) { Type type = AiTypeHelper.FindIEnumerable(seqType); Type result; if (type == null) { result = seqType; } else { result = type.GetGenericArguments()[0]; } return(result); }
public static Type GetNullAssignableType(Type type) { Type result; if (!AiTypeHelper.IsNullAssignable(type)) { result = typeof(Nullable <>).MakeGenericType(new Type[] { type }); } else { result = type; } return(result); }
public static bool IsInteger(Type type) { Type nonNullableType = AiTypeHelper.GetNonNullableType(type); bool result; switch (Type.GetTypeCode(type)) { case TypeCode.SByte: case TypeCode.Byte: case TypeCode.Int16: case TypeCode.UInt16: case TypeCode.Int32: case TypeCode.UInt32: case TypeCode.Int64: case TypeCode.UInt64: result = true; break; default: result = false; break; } return(result); }
public static bool IsNullAssignable(Type type) { return(!type.IsValueType || AiTypeHelper.IsNullableType(type)); }
public static ConstantExpression GetNullConstant(Type type) { return(Expression.Constant(null, AiTypeHelper.GetNullAssignableType(type))); }