我有一个带参数的方法,我想在我的全局应用程序类中调用它,但是当我传递null参数时,它会给出错误。我要分享我的代码,请指导我。
方法:
public static async Task getMessage(Controller page,string Email, int? PersonId, int? OrderDetailId, int? TicketDetailId)
{
using (var client = new ImapClient("imap.gmail.com", true))
{
// Connecting
if (client.Connect())
{
// Sign in
if (client.Login("abc@gmail.com", "*****"))
{
var excludeLabels = new string[] { "Processed" };
var senders = new string[] { Email };
// Building the search query
var query = string.Format("X-GM-RAW \"{0} -({1})\"",
string.Join(" OR ", senders.Select(sender => "(from:" + sender + ")")),
string.Join(" OR ", excludeLabels.Select(label => "(label:" + label + ")")));
var messages = client.Folders.Inbox.Search(query, MessageFetchMode.ClientDefault, 1000);
foreach (var msg in messages)
{
// Mark the message as seen
msg.Seen = true;
string plainTextBody = msg.Body.HasText ? msg.Body.Text : "";
string htmlBody = msg.Body.HasHtml ? msg.Body.Html : "";
var time = DateTime.SpecifyKind(msg.Date.HasValue ? msg.Date.Value : DateTime.Now, DateTimeKind.Utc);
if (msg.Attachments.Count() > 0)
{
foreach (var file in msg.Attachments)
{
var folder = Server.MapPath("~/Data/ConversationAttachments");
if (!Directory.Exists(folder))
{
Directory.CreateDirectory(folder);
}
string guid = Guid.NewGuid().ToString();
string webPath = null;
msg.Download(MessageFetchMode.Full);
int posOfDot = file.FileName.LastIndexOf(".");
string fName = Guid.NewGuid().ToString() + file.FileName.Substring(posOfDot);
webPath = "~/Data/ConversationAttachments/" + fName;
file.Save(Server.MapPath("~/Data/ConversationAttachments"), fName);
db.MailSystems.AddOrUpdate(c => c.MESSAGEID, new MailSystem
{
Message = htmlBody,
Date = time,
Attachment = webPath,
EmailType = "IMAP",
Subject = string.IsNullOrEmpty(msg.Subject) ? "RE: Ticket ID " + TicketDetailId.Value.ToString() : msg.Subject,
Sender = Email,
PersonID = PersonId.Value,
TicketDetailId = TicketDetailId.Value,
MESSAGEID = msg.MessageId
});
}
}
await db.SaveChangesAsync();
}
}
}
}
}
全球应用类:
protected void ThreadFunc()
{
System.Timers.Timer t = new System.Timers.Timer();
t.Elapsed += new System.Timers.ElapsedEventHandler(TimerWorker);
t.Interval = 10000;
t.Enabled = true;
t.AutoReset = true;
t.Start();
}
protected void TimerWorker(object sender, System.Timers.ElapsedEventArgs e)
{
GetMail.getMessage();
}
getMessage方法是静态GetMail类的静态成员。请指导我如何解决这个问题。我想每隔30秒自动启动一次getMessage方法。
答案 0 :(得分:0)
您的问题是您的代码尝试调用传递给您的方法的可空类型的其他方法和属性。
即
PersonId.Value
TicketDetailId.Value
如果你想在你的方法签名和中为那些参数传递空值,那么你需要修改你的代码,这样它就可以使这些参数为null。
简而言之,这里没有明显的答案,你不能传递空参数,并期望能够使用它们的属性和方法而不会遇到异常。
您通常的解决方案是,传递的类型不能为空:
public void MyMethod(int myValue)
或者之前进行空检查:
if (myThing == null)
{
return;
}
或者:
if (myThing != null)
{
// Do stuff.
}
或者应用' ??'运算符如果为null则应用默认值:
string myResult = myThing ?? string.Empty;
修改强>
您的另一个问题是您在没有参数的情况下调用getMessage()
方法。 getMessage
的签名如下:
getMessage(Controller page, string email, int? personId, int? orderDetailId, int? ticketDetailId)
(注意我根据典型的C#标准小写了你的论点名称的第一个字母)
调用它时应该传递一些参数:
getMessage("myPage", "test@hotmail.com", 2, 37, 92);
您需要了解更多关于C#和面向对象编程的基础知识。试着阅读一些关于C#开发的入门书籍。
答案 1 :(得分:0)
GetMail.getMessage();
不起作用,因为没有带这些签名的方法。参数可以为null(int **?**),但它们不是可选的..
更改为:
GetMail.getMessage(null, null, null, null, null);
或者创建一个没有参数的新方法......然后调用你的方法
public static void getMessage()
{
GetMessage(null, null, null, null, null);
}
或设置默认值
public static void getMessage(Person page = null, string Email ="", int? PersonId =0, int? OrderDetailId=0, int? TicketDetailId=0) { ... }
它会起作用......但是......这是一个令人毛骨悚然的代码: - )