不能调用带有空参数的方法
本文关键字:参数 方法 调用 不能 | 更新日期: 2023-09-27 18:14:37
我有一个带参数的方法,我想在我的全局应用程序类中调用它,但是当我传递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方法
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) { ... }
It will work…但. .这是一个令人毛骨悚然的代码:-)
您的问题是您的代码试图调用传递给您的方法的可空类型的其他方法和属性。
。
PersonId.Value
TicketDetailId.Value
如果你想在你的方法签名和中有可空的参数,可以为这些参数传递空值,你需要修改你的代码,使其与这些参数为空一起工作。
简而言之,这里没有明显的答案,你不能传入空参数,并期望能够使用它们的属性和方法而不遇到异常。
通常的解决方案是,传入不能为空的类型:
public void MyMethod(int myValue)
或者之前做null检查:
if (myThing == null)
{
return;
}
或:
if (myThing != null)
{
// Do stuff.
}
或者使用'?? ?
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#和面向对象编程的基本知识。