在调用之前检查Func <t,string> delegate中的T是否为空?</t,string>

时间:2014-04-07 19:27:52

标签: c# .net delegates .net-4.5

我试图弄清楚在调用对象之前如何检查对象是否为空。以下是一些示例代码:

 public class NotifyTemplate<T> where T : class
    {
        public Func<T, string> Value { get; set; }
        public string Key { get; set; }
    }

    public class User
    {
        public int Id { get; set; }
        public string UserName { get; set; }

        public Contact Contact { get; set; }

    }

    public class Contact
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }

我想在实际调用委托之前检查我尝试调用的任何对象是否为null。我可以尝试捕获,但这似乎有点过分。以下是我的用法示例:

var notifyList = new List<NotifyTemplate<User>>()
            {
                new NotifyTemplate<User>()
                {
                    Value = u => u.Contact.FirstName,
                    Key = "FName"
                },
                new NotifyTemplate<User>()
                {
                    Value = u => u.UserName,
                    Key = "UserName"
                }
            };

            var user = new User()
            {
                Id = 1,
                UserName = "ddivita@dd.com",

            };

            foreach (var notifyTemplate in notifyList)
            {
               //This is where I want to check if the value is null or not before I invoke.


                var name =  notifyTemplate.Value.Invoke(user);
            }

如您所见,Contact对象为null且未在new User声明中初始化。因此,在foreach语句中,我想检查Value属性,并在调用它之前查看我的委托中的对象是否为null。

关键在于我们正在设置通知系统并使开发人员更容易,Func将用于替换通知模板中的密钥。

以下是teh temaplte的样子:

<html>
   <body>
      Hello There [FName] [LName]. Thank you for signing up using the username: [UserName].

   </body>
</html>

开发人员会将他们想要使用的模板和NotifyTemplate列表传递给我们的通知服务

如果由于某种原因联系信息没有正确保留,我们从数据库中提取User对象,我们假设Contact对象为null。在调用invoke获取值之前,我们需要评估Contact对象是否为null。

2 个答案:

答案 0 :(得分:1)

你可以在lambda中执行此操作:

Value = u => u.Contact != null ? u.Contact.FirstName : string.Empty

答案 1 :(得分:0)

正如Neolisk建议的那样,我这样做:

foreach (var notifyTemplate in notifyList)
            {
                var value = string.Empty;
                try
                {
                   value  = notifyTemplate.Value.Invoke(user);
                }
                catch (Exception ex)
                {

                    //log error
                }

                var theVlaue = value;
        }