【问题标题】:cannot call method with null arguments c#不能用空参数调用方法c#
【发布时间】:2014-07-24 08:26:25
【问题描述】:

我有一个带参数的方法,我想在我的全局应用程序类中调用它,但是当我传递空参数时它会出错。我正在分享我的代码,请指导我。

方法:

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 方法。

【问题讨论】:

  • @KartikeyaKhosla 错误是 getMessage() 需要 5 个参数
  • 然后传递 5 个参数。
  • @KartikeyaKhosla 我尝试使用反射调用此方法,但它没有给出任何错误但没有调用该方法
  • 你在哪里使用 getMessage 呢?只是一个注释。你应该用大写来命名你的方法名,比如GetMessage()
  • @CodeCaster 我无法从全局应用程序类传递 5 个参数

标签: c# asp.net asp.net-mvc asp.net-mvc-4


【解决方案1】:
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) { ... }

它会工作......但是......这是一个令人毛骨悚然的代码:-)

【讨论】:

  • 有没有其他方法可以每隔30秒调用一次这个方法
  • 有没有办法通过wcf服务调用这个方法?
  • 哦.. 我有一个概念,你有一个控制台应用程序。 WCF 服务是一种获取数据的服务......不是为了启动一些“timerjobs”
【解决方案2】:

您的问题是您的代码尝试在传递给您的方法的可空类型上调用其他方法和属性。

PersonId.Value
TicketDetailId.Value

如果你想在你的方法签名中有可以为空的参数并且能够为这些参数传递空值,你需要修复你的代码,让它在这些参数为空的情况下工作。

简而言之,这里没有明显的答案,你不能传入空参数并期望能够使用它们的属性和方法而不会遇到异常。

您通常的解决方案是,传入不能为空的类型:

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# 开发的介绍性书籍。

【讨论】:

  • 感谢您的帮助,我已将 timerwork 方法更改为此“受保护的 void TimerWorker(object sender, ElapsedEventArgs e) { object[] arguments = new object[5]; MethodInfo method = typeof(GetMail ).GetMethod("getMessage"); method.Invoke(null, arguments); }" 错误消失但方法未执行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-11
  • 1970-01-01
  • 1970-01-01
  • 2021-02-11
  • 2018-12-24
相关资源
最近更新 更多