Principales respuestas
ERROR NO PUEDO CONVERTIR EL TIPO OBJECT A SYSTEM.COLLECTIONS.GENERIC.LIST<object>

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)
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
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.
- Propuesto como respuesta Pablo RubioModerator lunes, 1 de octubre de 2018 16:48
- Marcado como respuesta Pablo RubioModerator lunes, 1 de octubre de 2018 20:52
-
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
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.
- Propuesto como respuesta Pablo RubioModerator lunes, 1 de octubre de 2018 16:48
- Marcado como respuesta Pablo RubioModerator lunes, 1 de octubre de 2018 20:52
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
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.
- Propuesto como respuesta Pablo RubioModerator lunes, 1 de octubre de 2018 16:48
- Marcado como respuesta Pablo RubioModerator lunes, 1 de octubre de 2018 20:52
-
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- Editado DiegoFerChs viernes, 28 de septiembre de 2018 18:41
- Propuesto como respuesta Pablo RubioModerator lunes, 1 de octubre de 2018 16:48
-
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
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.
- Propuesto como respuesta Pablo RubioModerator lunes, 1 de octubre de 2018 16:48
- Marcado como respuesta Pablo RubioModerator lunes, 1 de octubre de 2018 20:52
-
hola
cuando sucede esto recomiendaria acudas primero a la documentacion para entender el contexto, entiendo se trata del evento del smtpcliente
Smtp
Client. 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- Propuesto como respuesta Pablo RubioModerator lunes, 1 de octubre de 2018 16:48