我试图弄清楚在调用对象之前如何检查对象是否为空。以下是一些示例代码:
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。
答案 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;
}