我正在编写一些显式运算符来将数据库模型类型转换为我的域模型。像这样(简化示例):
public static explicit operator DomainModel.Role(Role roleEntity)
{
DomainModel.Role role = new DomainModel.Role
{
RoleId = roleEntity.RoleId,
Name = roleEntity.Name
};
return role;
}
但roleEntity
参数可能为null。在.net框架中,大多数情况下,null实例的显式转换会导致异常。像这样:
user.Role = (DomainModel.Role)_userRepository.GetRole(user); // Would normally results in a NullReferenceException
但是如果调整显式运算符,上面的函数将按预期运行:
public static explicit operator DomainModel.Role(Role roleEntity)
{
DomainModel.Role role = roleEntity == null ? null : new DomainModel.Role
{
RoleId = roleEntity.RoleId,
Name = roleEntity.Name
};
return role;
}
问题:
答案 0 :(得分:5)
标题问题:允许显式运算符抛出(而隐式运算符不应该抛出)。
但是null
这样做是否有正当理由是一个设计决定,我想不会。
考虑:
object x = null;
string t = (string)x;
不投掷。
答案 1 :(得分:2)
我会使用诸如AutoMapper之类的库来促进类似类型之间的转换。您可以获得更大的灵活性并编写更少的代码。恕我直言,使用显式强制转换操作符在阅读代码时不太容易理解,它给人的印象是当它可能是相当复杂的映射代码时它是一个便宜的操作。
答案 2 :(得分:1)
我想是的。将null
引用转换为另一种类型通常应该生成null
引用,以与正常语义匹配。
e.g。因为这有效:
object x = null;
var role = (DomainModel.Role)x;
这也应该有效:
Role x = null;
var role = (DomainModel.Role)x;
答案 3 :(得分:1)
恕我直言意见不,你不应该这样做。
我认为之间没有任何区别:
string myString= (string)null;
和
Object o = null;
string myString= (string)o;
在这两种情况下,我都希望返回null
这是默认行为(我不建议使用NullReferenceException
,因为上面的两个代码段都是完全有效的:两个显式转换都返回{{1} })。
我会觉得将null
引用以某种方式转换为默认对象有点令人困惑:
null
如果这种情况有意义,我会通过构造函数或特定的静态方法实现它,很明显你创建一个新对象,从不通过隐式或显式运算符。
强制转换运算符应该完成它的意图:从一种类型转换为另一种类型。 object o = null;
string myString = (string)o; //myString == String.Empty WTF?
只能“转换”为null
。