2015-08-18 2 views
-1

Я пишу программу, которая отправляет пользователю информацию о хранении электронной почты. То, что я пытаюсь выполнить, - это если письмо было отправлено успешно, то оно будет записывать в файл журнала, что письмо было отправлено успешно. Моя единственная проблема заключается в том, что я нахожу трудность в получении инструкции if для этого. Я понимаю, что я не могу поместить метод в оператор if, потому что вы не можете преобразовать метод voided в boolean, но каким другим способом я мог бы это сделать? Ниже приведен код, который я пробовал вместе с методом SendEmail.C# - Как использовать метод voided в выражении if

SendEmail(BuildEmailBody(transaction, myHomeInformation),subjectLine); 
    if (SendEmail.Success()) 
    { 
     BOAssistant.WriteLine     
    } 

Это метод:

private static void SendEmail(string emailBody, string emailSubject) 
    { 
     //This is the method that will create the email for you 
     Email email = new Email(); 
     email.To.Add("[email protected]"); 
     email.Subject = emailSubject; 
     email.Body = emailBody; 
     email.Send(); 
    } 
+0

Вернуть 'bool' из вашей' функции SendEmail' говоря, удалось ли это или нет (я не» я знаю, как это сделать с классом «Email», но вы можете понять это). Тогда ваш оператор 'if' будет просто' if (SendEmail (тело, тема)) {/ * code * /} '. – Jashaszun

+0

Вы должны выполнить это в своем ** методе отправки электронной почты ** ... либо вернуть значение, либо выполнить функцию успеха там – code

+2

И как вы собираетесь знать, действительно ли письмо действительно отправлено успешно? – Servy

ответ

0
if (SendEmail(BuildEmailBody(transaction, myHomeInformation),subjectLine)) 
{ 
    BOAssistant.WriteLine     
} 

...

private static bool SendEmail(string emailBody, string emailSubject) 
{ 
    //This is the method that will create the email for you 
    Email email = new Email(); 
    email.To.Add("[email protected]"); 
    email.Subject = emailSubject; 
    email.Body = emailBody; 
    try{ 
    email.Send(); 
    } catch(Exception e) { return false; } 
    return true; 
} 

или

bool isSent; 
SendEmail(BuildEmailBody(transaction, myHomeInformation),subjectLine, out isSent); 
if (isSent) 
{ 
    BOAssistant.WriteLine     
} 

...

private static void SendEmail(string emailBody, string emailSubject, out bool isSent) 
{ 
    //This is the method that will create the email for you 
    Email email = new Email(); 
    email.To.Add("[email protected]"); 
    email.Subject = emailSubject; 
    email.Body = emailBody; 
    try{ 
    email.Send(); 
    } catch(Exception e) { isSent = false; } 
    isSent = true; 
} 

или

SendEmail(BuildEmailBody(transaction, myHomeInformation),subjectLine,() => BOAssistant.WriteLine); 

...

private static void SendEmail(string emailBody, string emailSubject, Action onSuccess) 
{ 
    //This is the method that will create the email for you 
    Email email = new Email(); 
    email.To.Add("[email protected]"); 
    email.Subject = emailSubject; 
    email.Body = emailBody; 
    try{ 
    email.Send(); 
    } catch(Exception e) { return; } 
    onSuccess(); 
} 
+1

Когда метод только когда-либо возвращает 'true', его довольно бессмысленно, чтобы он вообще ничего не возвращал. – Servy

+0

Я предполагаю, что версия с параметром 'out' должна иметь тип возврата' void', а не 'bool', тем более, что вы ничего не возвращаете. И пока это будет работать, это просто плохой дизайн ИМХО. – juharr

+0

Первый ответ, который вы предоставили, отлично работает. Спасибо! – user4967003

0

Если ваш метод должен быть void типа возврата (это то, что я предполагаю, основываясь на названии вопроса), то вы можете введите параметр out. Его не нужно инициализировать перед вызовом метода, но вы должны назначить ему значение внутри самого метода. Параметр out передается по ссылке, поэтому любое значение, присвоенное ему вызываемым абонентом, отражается в вызывающем абоненте.

bool sentSuccessfully; 
SendEmail(string emailBody, string emailSubject, out sentSuccessfully) 

if(sentSuccessfully) 
{ 
    // do whatever you need 
} 

Конечно вам нужно будет модифицировать свой метод SendEmail включить этот дополнительный параметр.

2

Если вы знаете, что неудачная электронной почты будет сгенерировано исключение, вы можете справиться с этим, как это:

try 
{ 
    SendEmail(BuildEmailBody(transaction, myHomeInformation),subjectLine); 
    BOAssistant.WriteLine //log success here 
} 
catch(Exception ex) 
{ 
    //unsuccessful here 
}  
+0

Конечно, это предположение * не будет * на самом деле справедливым на практике. Просто потому, что 'Send' не выбрасывает, это не означает, что письмо будет действительно успешно отправлено/получено. – Servy

+0

Поймать тип «Исключение» - это не очень хорошая идея в большинстве случаев. Что-то еще может пойти не так, прежде чем пытаться отправить электронное письмо, и он все равно будет пойман. И как мы узнаем, что исключение будет выброшено, когда электронное письмо не будет отправлено? – Kapol

+1

@ Kapol Поймать «Исключение» здесь почти наверняка. Ответ на сообщение электронной почты, которое не будет успешно отправлено, почти наверняка будет точно таким же, независимо от того, что на самом деле вызвало проблему, а именно для регистрации ошибки и информирования пользователя (если это не автоматический процесс), что письмо не могло " t будет отправлено. – Servy

0

Лучший вариант должен был бы изменить тип возвращаемого методом Sendmail к BOOL и использовать его, если заявление.

private static bool SendEmail(string emailBody, string emailSubject) 
{ 
    try 
    { 
    Email email = new Email(); 
    email.To.Add("[email protected]"); 
    email.Subject = emailSubject; 
    email.Body = emailBody; 
    email.Send(); 
    return true; 
    } 
    catch(Exception ex) 
    { 
    return false; 
    } 
} 

При изменении типа метод возврата не вариант, то вы можете сделать это,

bool IsSuccessfullySent; 
try 
{ 
SendEmail(BuildEmailBody(transaction, myHomeInformation),subjectLine); 
IsSuccessfullySent= true; 
} 
catch(Exception ex) 
{ 
IsSuccessfullySent=false; 
} 
if (IsSuccessfullySent) 
{ 
    BOAssistant.WriteLine     
} 
Смежные вопросы