2011-11-04 3 views
1

Je ne sais pas pourquoi j'obtiens cette erreur. Semble élémentaire. Quoi qu'il en soit, j'ai une classe singleton appelée EmailSender. Le code ci-dessous est court et facile. Le problème est que je ne peux pas utiliser l'expéditeur dans la classe MainWindow. Tout ce que j'essaie comme sender.Send() est traité comme si j'avais fait asdafsafas.Send(). Il est traité comme s'il s'agissait d'une chaîne de caractères aléatoire. Je ne sais pas pourquoi cela se passe.C# Impossible de résoudre le symbole

using System; 
using System.Net.Mail; 
using System.Windows.Forms; 

namespace SendMail 
{ 
    public partial class MainWindow : Form 
    { 
     #region Private variables 
     private MailMessage msg = new MailMessage(); 
     private EmailSender sender = EmailSender.GetInstance(); 
     #endregion 

     public MainWindow() 
     { 
      InitializeComponent(); 

     } 

     private MailMessage PrepareMailMessage() 
     { 

      return msg; 
     } 

     private void btnSend_Click(object sender, EventArgs e) 
     { 

     } 
    } 
} 

Voici la méthode GetInstance:

public static EmailSender GetInstance() 
{ 
    return _instance ?? (_instance = new EmailSender()); 
} 
+0

Quel est le message d'erreur exact? – Vlad

+0

Impossible de résoudre l'expéditeur du symbole. Lorsque je compile, j'obtiens: Invalid token '(' dans la classe, struct, ou déclaration de membre d'interface \t dans MainWindow.cs – s5s

+0

Ok, et quelle ligne produit ce message d'erreur? – Vlad

Répondre

6

Ceci est dû à la façon dont vous avez cette méthode définie (l'expéditeur est un paramètre). C'est trouver l'argument de méthode d'abord, pas votre variable de niveau de classe. Vous pouvez qualifier ceci:

private void btnSend_Click(object sender, EventArgs e) 
{ 
    // sender here is the "(object sender, " paramater, so it's defined 
    // as system object. 

    // use this instead: 
    this.sender.Send(); // The "this" will make the class find the instance level variable instead of using the "object sender" argument 
} 
+0

OK je vois Oh, j'ai oublié l'objet expéditeur J'essaie de réviser mon C# et merci – s5s

+0

@User: Un workaroun facile d doit suivre les conventions de style et préfixer les variables privées avec _. Ex: '_sender' –

+0

@DBM Ou, alternativement, prenez l'habitude de suivre les directives StyleCop, qui suggèrent ** toujours ** de préfixer l'accès des membres via' this. *** '. –

1

C'est parce que sender n'est pas un objet de courrier, mais plutôt le bouton qui a déclenché l'événement. Vous avez besoin du SmtpClient d'envoyer l'e-mail:

private void btnSend_Click(object sender, EventArgs e) 
{ 
    SmtpClient client = new SmtpClient("192.0.0.1", 25); //host, port 
    client.Send(msg); 
} 

En outre, la classe MailMessage implémente IDisposable, vous avez donc besoin du code pour disposer du message une fois que vous avez terminé avec elle.

J'ai créé une enveloppe qui comprend tout ce dont vous avez besoin pour envoyer des emails, y compris l'élimination:

/// <summary> 
/// Wrapper class for the System.Net.Mail objects 
/// </summary> 
public class SmtpMailMessage : IDisposable 
{ 
    #region declarations 

    MailMessage Message; 
    SmtpClient SmtpMailClient; 

    #endregion 

    #region constructors 

    /// <summary> 
    /// Default constructor for the SmtpMailMessage class 
    /// </summary> 
    public SmtpMailMessage() 
    { 
     //initialize the mail message 
     Message = new MailMessage(); 
     Message.Priority = MailPriority.Normal; 
     Message.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;    
     Message.From = new MailAddress("[email protected]");   

     //initialize the smtp client 
     SmtpMailClient = new SmtpClient(); 
     SmtpMailClient.DeliveryMethod = SmtpDeliveryMethod.Network; 
     SmtpMailClient.Host = "192.168.0.1"; 
     SmtpMailClient.Port = 25; 
    } 

    /// <summary> 
    /// Parameterized constructor for the SmtpMailMessage class. Allows for override of the default 
    /// SMTP host and port number 
    /// </summary> 
    /// <param name="HostIP">The IP address of the exchange server</param> 
    /// <param name="PortNumber">The port number for ingoing and outgoing SMTP messages</param> 
    public SmtpMailMessage(string HostIP, int PortNumber) : this() 
    { 
     //override the smtp host value 
     SmtpMailClient.Host = HostIP; 

     //override the smtp port value 
     SmtpMailClient.Port = PortNumber; 
    } 

    #endregion 

    #region subject/body 

    /// <summary> 
    /// The body content of the mail message 
    /// </summary> 
    public string Body 
    { 
     get 
     { 
      return Message.Body; 
     } 
     set 
     { 
      Message.Body = value; 
     } 
    } 

    /// <summary> 
    /// the subject of the mail message 
    /// </summary> 
    public string Subject 
    { 
     get 
     { 
      return Message.Subject; 
     } 
     set 
     { 
      Message.Subject = value; 
     } 
    } 

    #endregion 

    #region mail type 

    /// <summary> 
    /// Gets or sets a value that determines whether the mail message 
    /// should be formatted as HTML or text 
    /// </summary> 
    public bool IsHtmlMessage 
    { 
     get 
     { 
      return Message.IsBodyHtml; 
     } 
     set 
     { 
      Message.IsBodyHtml = value; 
     } 
    } 

    #endregion 

    #region sender 

    /// <summary> 
    /// Gets or sets the from address of this message 
    /// </summary> 
    public string From 
    { 
     get 
     { 
      return Message.From.Address; 
     } 
     set 
     { 
      Message.From = new MailAddress(value); 
     } 
    } 

    #endregion 

    #region recipients 

    /// <summary> 
    /// Gets the collection of recipients 
    /// </summary> 
    public MailAddressCollection To 
    { 
     get 
     { 
      return Message.To; 

     } 
    } 

    /// <summary> 
    /// Gets the collection of CC recipients 
    /// </summary> 
    public MailAddressCollection CC 
    { 
     get 
     { 
      return Message.CC; 
     } 
    } 

    /// <summary> 
    /// Gets the collection of Bcc recipients 
    /// </summary> 
    public MailAddressCollection Bcc 
    { 
     get 
     { 
      return Message.Bcc; 
     } 
    } 

    #endregion 

    #region delivery notification 

    /// <summary> 
    /// Gets or sets the delivery notification settings for this message 
    /// </summary> 
    public DeliveryNotificationOptions DeliveryNotifications 
    { 
     get 
     { 
      return Message.DeliveryNotificationOptions; 
     } 
     set 
     { 
      Message.DeliveryNotificationOptions = value; 
     } 
    } 

    #endregion 

    #region priority 

    /// <summary> 
    /// Gets or sets the Priority of this message 
    /// </summary> 
    public MailPriority PriorityLevel 
    { 
     get 
     { 
      return Message.Priority; 
     } 
     set 
     { 
      Message.Priority = value; 
     } 
    } 

    #endregion 

    #region send methods 

    /// <summary> 
    /// Sends the message anonymously (without credentials) 
    /// </summary> 
    public void Send() 
    { 
     SmtpMailClient.Send(Message); 
    } 

    /// <summary> 
    /// Sends the message with authorization from a network account 
    /// </summary> 
    /// <param name="Username">The Windows username of the authorizing user</param> 
    /// <param name="Password">The Windows password of the authorizing user</param> 
    /// <param name="Domain">The domain name of the network to which the authorizing user belongs</param> 
    public void Send(string Username, string Password, string Domain) 
    { 
     //attach a network credential to this message using the information passed into the method 
     SmtpMailClient.Credentials = new NetworkCredential(Username, Password, Domain); 

     //send the message 
     SmtpMailClient.Send(Message); 
    } 

    #endregion 

    #region IDisposable implementation 

    ~SmtpMailMessage() 
    { 
     Dispose(false); 
    } 

    public void Dispose() 
    { 
     Dispose(true);    
    } 

    protected virtual void Dispose(bool disposing) 
    { 
     if (disposing) 
     { 
      if (Message != null) 
       Message.Dispose(); 
      Message = null;     
      SmtpMailClient = null; 
     } 
    } 

    #endregion   
} 

Mise en œuvre:

using (SmtpMailMessage mail = new SmtpMailMessage("192.168.0.1", 25)) 
{ 
    //set the to address to the primary email 
    mail.To.Add("[email protected]"); 

    //set the message type and subject and body 
    mail.IsHtmlMessage = true; 
    mail.Subject = "Foo"; 
    mail.Body = "Hello world!"; 

    //send the email 
    mail.Send(); 
} 
0

Si vous le faites dans le cadre de votre méthode btnSend_Click, le paramètre object sender a priorité sur le EmailSender sender global.

Vous devez renommer votre variable globale, par exemple: EmailSender m_sender ou spécifier exactement quel expéditeur que vous voulez: this.sender.Send()

0

Je suppose que vous appelez l'expéditeur.Envoyez dans la fonction btnSend_Click.

Dans cette fonction est un param également appelé expéditeur (expéditeur d'objet). Maintenant vous codez est confus lequel utiliser. Renommez donc votre expéditeur var privé.

Questions connexes