C# 检查功能中是否有T<;T、 字符串>;委托在调用之前是否为null?

C# 检查功能中是否有T<;T、 字符串>;委托在调用之前是否为null?,c#,.net,delegates,.net-4.5,C#,.net,Delegates,.net 4.5,我试图弄清楚如何在调用对象之前检查它是否为null。以下是一些示例代码: 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

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

 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; }
    }
开发人员将把他们想要使用的模板和NotifyTemplate列表传递到我们的通知服务中


如果由于某种原因,联系人信息没有正确保存,并且我们从数据库中提取了一个用户对象,那么让我们假设联系人对象为null。在调用invoke获取值之前,我们需要评估Contact对象是否为null

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

Value = u => u.Contact != null ? u.Contact.FirstName : string.Empty
正如建议的那样,我正在这样做:

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

                    //log error
                }

                var theVlaue = value;
        }

@Servy,也许我遗漏了一些东西,但是假设我不知道开发人员将传递到什么,除了它是一个用户对象。在这种情况下,值是Func。如何在调用User.Contact之前测试它是否为null?也许我让这件事变得比我需要的更难了。我不打算检查user.Contact==null,我需要使其更具动态性……因此,可以这样表示:如果Value中的属性为null,请不要尝试调用它。因此,如果我尝试获取user.Contact.FirstName并调用它,我将得到一个空引用异常。要回答您的问题,请检查一个委托是否为
Null
,与任何其他对象相同。作为旁注,它确实看起来很复杂,因为它在上面所做的事情。我不明白为什么一开始就要这么复杂。如果您可以详细说明…@DDiVita,那么在访问其成员之前,您可以检查该值是否为null,就像任何其他代码一样。@neolik,我更新了我的问题。@DDiVita,它不会更改我的注释。如果您希望某些代码能够在对象不为null时获取某些属性的值,那么请检查它是否为null。就这么简单。是的,这是可行的,但是如果表达式写得像我一样,我们在foreach中该怎么做?@DDiVita你什么都不做。如果委托想要对给定的数据抛出异常,委托的调用程序无法执行任何操作。@Servy,这是我的问题吗?如何在不抛出异常的情况下执行该操作,或者这是不可能的。我在问是否可以在调用属性之前检查属性是否为null。@DDiVita从技术上讲,您的问题是在委托为null时如何不调用委托,而不是在委托访问其主体中某个null对象时如何不调用委托。
Value = u => u.Contact != null ? u.Contact.FirstName : string.Empty
foreach (var notifyTemplate in notifyList)
            {
                var value = string.Empty;
                try
                {
                   value  = notifyTemplate.Value.Invoke(user);
                }
                catch (Exception ex)
                {

                    //log error
                }

                var theVlaue = value;
        }