public static Type FindDelegateType(TypeDefinition returnType, TypeDefinition[] parameterTypes) { var typeName = "System." + (returnType.TryGetRuntimeType() == typeof(void) ? "Action" : "Func"); if (returnType.TryGetRuntimeType() == typeof(void) && parameterTypes.Length > 0) { typeName += "`" + parameterTypes.Length.ToString("D", CultureInfo.InvariantCulture); } else { typeName += "`" + (parameterTypes.Length + 1).ToString("D", CultureInfo.InvariantCulture); } var type = Type.GetType(typeName, false); if (type == null) { // Try get from System.Core.dll type = typeof(Enumerable).GetAssembly().GetType(typeName); } return(type); }
internal static TypeDefinition GetDelegateTypeDefinition( TypeDefinition returnType, TypeDefinition[] parameterTypes ) { var typeDefinition = FindDelegateType( returnType, parameterTypes ); return returnType.TryGetRuntimeType() == typeof( void ) ? parameterTypes.Length == 0 ? typeDefinition : TypeDefinition.GenericReferenceType( typeDefinition, parameterTypes ) : TypeDefinition.GenericReferenceType( typeDefinition, parameterTypes.Concat( new[] { returnType } ).ToArray() ); }
internal static Type GetResolvedDelegateType( TypeDefinition returnType, TypeDefinition[] parameterTypes ) { var typeDefinition = FindDelegateType( returnType, parameterTypes ); return returnType.TryGetRuntimeType() == typeof( void ) ? parameterTypes.Length == 0 ? typeDefinition : typeDefinition.MakeGenericType( parameterTypes.Select( t => t.ResolveRuntimeType() ).ToArray() ) : typeDefinition.MakeGenericType( parameterTypes.Select( t => t.ResolveRuntimeType() ).Concat( new[] { returnType.ResolveRuntimeType() } ).ToArray() ); }
internal static TypeDefinition GetDelegateTypeDefinition(TypeDefinition returnType, TypeDefinition[] parameterTypes) { var typeDefinition = FindDelegateType(returnType, parameterTypes); return (returnType.TryGetRuntimeType() == typeof(void) ? parameterTypes.Length == 0 ? typeDefinition : TypeDefinition.GenericReferenceType(typeDefinition, parameterTypes) : TypeDefinition.GenericReferenceType(typeDefinition, parameterTypes.Concat(new[] { returnType }).ToArray())); }
internal static Type GetResolvedDelegateType(TypeDefinition returnType, TypeDefinition[] parameterTypes) { var typeDefinition = FindDelegateType(returnType, parameterTypes); return (returnType.TryGetRuntimeType() == typeof(void) ? parameterTypes.Length == 0 ? typeDefinition : typeDefinition.MakeGenericType(parameterTypes.Select(t => t.ResolveRuntimeType()).ToArray()) : typeDefinition.MakeGenericType(parameterTypes.Select(t => t.ResolveRuntimeType()).Concat(new[] { returnType.ResolveRuntimeType() }).ToArray())); }
public static Type FindDelegateType( TypeDefinition returnType, TypeDefinition[] parameterTypes ) { var typeName = "System." + ( returnType.TryGetRuntimeType() == typeof( void ) ? "Action" : "Func" ); if ( returnType.TryGetRuntimeType() == typeof( void ) && parameterTypes.Length > 0 ) { typeName += "`" + parameterTypes.Length.ToString( "D", CultureInfo.InvariantCulture ); } else { typeName += "`" + ( parameterTypes.Length + 1 ).ToString( "D", CultureInfo.InvariantCulture ); } var type = Type.GetType( typeName, false ); if ( type == null ) { // Try get from System.Core.dll type = typeof( Enumerable ).GetAssembly().GetType( typeName ); } return type; }