none
ERROR NO PUEDO CONVERTIR EL TIPO OBJECT A SYSTEM.COLLECTIONS.GENERIC.LIST<object> RRS feed

  • Pregunta

  •  private static void SendCompletedCallback(object sender, AsyncCompletedEventArgs e)
        {

            List<object> obj = e.UserState;
            MailMessage mail = (MailMessage)obj[0];
            string codEnvio = obj[1].ToString();

            //el obj tiene dos valores un '0' y un '1'

            string no_asunto = mail.Subject;
            string Email_Destino = mail.To[0].ToString(); // Email del personal enviado
            string Error_Envio = "";
            if (e.Error != null)
            {
                // Console.WriteLine("Error {1} ocurrido mientras se enviaba el correo [{0}] ", no_asunto, e.Error.ToString());
                mailSent = false;
                try
                {
                    Error_Envio = "Error al enviar correo: " + e.Error.ToString();
                }
                catch (Exception ex)
                {
                    Error_Envio = "Error controlado al enviar correo: " + ex.Message;
                }
            }
            else if (e.Cancelled)
            {
                mailSent = false;
                // Console.WriteLine("Envio cancelado de correo con asunto [{0}].", no_asunto);
                Error_Envio = "Correo cancelado";
            }
            else
                // Console.WriteLine("Mensaje [{1}] enviado.", no_asunto);
                mailSent = true;

            if (mailSent == false)
            {
                // Graba error de envio de correo 
                SqlConnection cn = new SqlConnection(Conex.CadCon_String());
                if (cn.State != ConnectionState.Open)
                    cn.Open();
                SqlCommand cmd_Email = new SqlCommand("update tbl_envio_doc_electronicos set fl_error_envio='1',no_correo_enviado='', no_error_envio=@no_error_envio where id_envio=@id_envio", cn);
                cmd_Email.CommandType = CommandType.Text;
                // cmd_Email.Parameters.AddWithValue("@fe_envio", DBNull.Value)
                cmd_Email.Parameters.AddWithValue("@no_error_envio", Error_Envio);
                cmd_Email.Parameters.AddWithValue("@id_envio", codEnvio);
                cmd_Email.ExecuteNonQuery();
                if (cn.State != ConnectionState.Closed)
                    cn.Close();
            }
        }

    HOLA AMIGOS TENGO UN ERROR EN "e.UserState" el error me dice : 

    "No se puede convertir implicitamente el tipo object en 'System.Collections.Generic.List<object>'. Ya existe una conversion 

    explicita(compruebe si le falta una conversion)


           
    viernes, 28 de septiembre de 2018 17:20

Respuestas

  • Buenas,

    En tu código veo cosas raras... 

    Por lo que dice el error, e.UserState es un tipo object, por lo tanto no puedes hacer eso, tendrías que hacer

    List<object> obj = new List<object>();
    obj.Add(e.UserState);

    Y con eso ese error desaparece, pero veo que después utilizas ese mismo objeto mediante obj[0] para hacer un casting a MailMessage. También veo que intentas utilizar un segundo objeto que no se de donde está para sacar el código de envío, pero esa lista no tiene dos ítems, solo tiene uno, el e.UserState.

    Podrías explicarnos más sobre tu aplicación, que es lo que te ofrece ese evento, y que es lo que quieres que haga? Digo esto porque no veo un error de programación en tu código, sino uno de concepto. Si nos cuentas más sobre ello igual podemos darte una buena solución.

    Quedó a la espera de tu respuesta

    Atte


    Jorge Turrado Ferrero

    Mis repositorios en GitHub
    Ranking GitHub Euskadi
    Ranking GitHub Alava

    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    viernes, 28 de septiembre de 2018 17:41
  • Uff...

    Las conversiones de Visual Basic a C# son delicadas, sobre todo cuando no esta habilitada la opción strict, ya que vb hace conversiones implícitas que c# no hace...

    Yo te diría que pruebes esto:

     private static void SendCompletedCallback(object sender, AsyncCompletedEventArgs e)
        {
            MailMessage mail = (MailMessage)e.UserState;
            string codEnvio = (string)e.UserState;
    
            //el obj tiene dos valores un '0' y un '1'
    
            string no_asunto = mail.Subject;
            string Email_Destino = mail.To[0].ToString(); // Email del personal enviado
            string Error_Envio = "";
            if (e.Error != null)
            {
                // Console.WriteLine("Error {1} ocurrido mientras se enviaba el correo [{0}] ", no_asunto, e.Error.ToString());
                mailSent = false;
                try
                {
                    Error_Envio = "Error al enviar correo: " + e.Error.ToString();
                }
                catch (Exception ex)
                {
                    Error_Envio = "Error controlado al enviar correo: " + ex.Message;
                }
            }
            else if (e.Cancelled)
            {
                mailSent = false;
                // Console.WriteLine("Envio cancelado de correo con asunto [{0}].", no_asunto);
                Error_Envio = "Correo cancelado";
            }
            else
                // Console.WriteLine("Mensaje [{1}] enviado.", no_asunto);
                mailSent = true;
    
            if (mailSent == false)
            {
                // Graba error de envio de correo 
                SqlConnection cn = new SqlConnection(Conex.CadCon_String());
                if (cn.State != ConnectionState.Open)
                    cn.Open();
                SqlCommand cmd_Email = new SqlCommand("update tbl_envio_doc_electronicos set fl_error_envio='1',no_correo_enviado='', no_error_envio=@no_error_envio where id_envio=@id_envio", cn);
                cmd_Email.CommandType = CommandType.Text;
                // cmd_Email.Parameters.AddWithValue("@fe_envio", DBNull.Value)
                cmd_Email.Parameters.AddWithValue("@no_error_envio", Error_Envio);
                cmd_Email.Parameters.AddWithValue("@id_envio", codEnvio);
                cmd_Email.ExecuteNonQuery();
                if (cn.State != ConnectionState.Closed)
                    cn.Close();
            }
        }

    aunque ya te aviso que tengo mis serias dudas sobre que funcione... no veo una traducción directa del código...

    Nos comentas como te va

    Atte


    Jorge Turrado Ferrero

    Mis repositorios en GitHub
    Ranking GitHub Euskadi
    Ranking GitHub Alava

    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    viernes, 28 de septiembre de 2018 20:53

Todas las respuestas

  • Buenas,

    En tu código veo cosas raras... 

    Por lo que dice el error, e.UserState es un tipo object, por lo tanto no puedes hacer eso, tendrías que hacer

    List<object> obj = new List<object>();
    obj.Add(e.UserState);

    Y con eso ese error desaparece, pero veo que después utilizas ese mismo objeto mediante obj[0] para hacer un casting a MailMessage. También veo que intentas utilizar un segundo objeto que no se de donde está para sacar el código de envío, pero esa lista no tiene dos ítems, solo tiene uno, el e.UserState.

    Podrías explicarnos más sobre tu aplicación, que es lo que te ofrece ese evento, y que es lo que quieres que haga? Digo esto porque no veo un error de programación en tu código, sino uno de concepto. Si nos cuentas más sobre ello igual podemos darte una buena solución.

    Quedó a la espera de tu respuesta

    Atte


    Jorge Turrado Ferrero

    Mis repositorios en GitHub
    Ranking GitHub Euskadi
    Ranking GitHub Alava

    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    viernes, 28 de septiembre de 2018 17:41
  • Ya lo he intentado poniendo ese código

    List<object> obj = new List<object>();
    obj.Add(e.UserState);

    , pero yo no quiero crear una nueva lista, estoy pasado un formulario de visual basic a C# que envia correos dentro de estos envian pdfs de boletas, facturas , etc....

    el codigo de visual basic es este , y el formulario en VisualBasic si me funciona.. pero ahora lo estoy pasando para web C#net.... como te digo no quiero crear una lista nueva porque se agregan dos variables y yo quiero que salga directo...

    el obj[0] -> esta todo el cuerpo de mensaje que se le envia al correo

    Private Shared Sub SendCompletedCallback(sender As Object, e As AsyncCompletedEventArgs)
            'Dim mail As MailMessage = CType(e.UserState, MailMessage)
            Dim obj As List(Of Object) = e.UserState
            Dim mail As MailMessage = CType(obj(0), MailMessage)
            Dim codEnvio As String = obj(1).ToString()

            Dim no_asunto As String = mail.Subject
            Dim Email_Destino As String = mail.To(0).ToString() 'Email del personal enviado
            Dim Error_Envio As String = ""
            If e.Error IsNot Nothing Then
                'Console.WriteLine("Error {1} ocurrido mientras se enviaba el correo [{0}] ", no_asunto, e.Error.ToString());
                mailSent = False
                Try
                    Error_Envio = "Error al enviar correo: " & e.Error.ToString()
                Catch ex As Exception
                    Error_Envio = "Error controlado al enviar correo: " & ex.Message
                End Try

            ElseIf e.Cancelled Then
                mailSent = False
                'Console.WriteLine("Envio cancelado de correo con asunto [{0}].", no_asunto);
                Error_Envio = "Correo cancelado"
            Else
                'Console.WriteLine("Mensaje [{1}] enviado.", no_asunto);
                mailSent = True
            End If

            If mailSent = False Then
                'Graba error de envio de correo 
                Dim cn As New SqlConnection(Parametros.GetDbConnectionString())
                If cn.State <> ConnectionState.Open Then
                    cn.Open()
                End If
                Dim cmd_Email As New SqlCommand("update tbl_envio_doc_electronicos set fl_error_envio='1',no_correo_enviado='', no_error_envio=@no_error_envio where id_envio=@id_envio", cn)
                cmd_Email.CommandType = CommandType.Text
                'cmd_Email.Parameters.AddWithValue("@fe_envio", DBNull.Value)
                cmd_Email.Parameters.AddWithValue("@no_error_envio", Error_Envio)
                cmd_Email.Parameters.AddWithValue("@id_envio", codEnvio)
                cmd_Email.ExecuteNonQuery()
                If cn.State <> ConnectionState.Closed Then
                    cn.Close()
                End If
            End If

        End Sub


    viernes, 28 de septiembre de 2018 18:25
  • Uff...

    Las conversiones de Visual Basic a C# son delicadas, sobre todo cuando no esta habilitada la opción strict, ya que vb hace conversiones implícitas que c# no hace...

    Yo te diría que pruebes esto:

     private static void SendCompletedCallback(object sender, AsyncCompletedEventArgs e)
        {
            MailMessage mail = (MailMessage)e.UserState;
            string codEnvio = (string)e.UserState;
    
            //el obj tiene dos valores un '0' y un '1'
    
            string no_asunto = mail.Subject;
            string Email_Destino = mail.To[0].ToString(); // Email del personal enviado
            string Error_Envio = "";
            if (e.Error != null)
            {
                // Console.WriteLine("Error {1} ocurrido mientras se enviaba el correo [{0}] ", no_asunto, e.Error.ToString());
                mailSent = false;
                try
                {
                    Error_Envio = "Error al enviar correo: " + e.Error.ToString();
                }
                catch (Exception ex)
                {
                    Error_Envio = "Error controlado al enviar correo: " + ex.Message;
                }
            }
            else if (e.Cancelled)
            {
                mailSent = false;
                // Console.WriteLine("Envio cancelado de correo con asunto [{0}].", no_asunto);
                Error_Envio = "Correo cancelado";
            }
            else
                // Console.WriteLine("Mensaje [{1}] enviado.", no_asunto);
                mailSent = true;
    
            if (mailSent == false)
            {
                // Graba error de envio de correo 
                SqlConnection cn = new SqlConnection(Conex.CadCon_String());
                if (cn.State != ConnectionState.Open)
                    cn.Open();
                SqlCommand cmd_Email = new SqlCommand("update tbl_envio_doc_electronicos set fl_error_envio='1',no_correo_enviado='', no_error_envio=@no_error_envio where id_envio=@id_envio", cn);
                cmd_Email.CommandType = CommandType.Text;
                // cmd_Email.Parameters.AddWithValue("@fe_envio", DBNull.Value)
                cmd_Email.Parameters.AddWithValue("@no_error_envio", Error_Envio);
                cmd_Email.Parameters.AddWithValue("@id_envio", codEnvio);
                cmd_Email.ExecuteNonQuery();
                if (cn.State != ConnectionState.Closed)
                    cn.Close();
            }
        }

    aunque ya te aviso que tengo mis serias dudas sobre que funcione... no veo una traducción directa del código...

    Nos comentas como te va

    Atte


    Jorge Turrado Ferrero

    Mis repositorios en GitHub
    Ranking GitHub Euskadi
    Ranking GitHub Alava

    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    viernes, 28 de septiembre de 2018 20:53
  • hola

    cuando sucede esto recomiendaria acudas primero a la documentacion para entender el contexto, entiendo se trata del evento del smtpcliente

    SmtpClient.SendCompleted

    si es asi el UserState es un string

    String token = (string) e.UserState;

    y no una List<Object>, ademas poderas poner un breakpoint en el codigo y cuando se detenga pasar el mouse por sobre la propiedad he inspeccionar que tipo de dato estas obteniendo en lugar de adivinar en base a vb.net que quien lo programo no se de donde saco que debe usarse object

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    sábado, 29 de septiembre de 2018 1:39