扩展方法和显式强制转换
本文关键字:转换 方法 扩展 | 更新日期: 2023-09-27 18:15:57
我正在使用来自某些汇编的类(源代码不可用),因此不可能更改它们的代码我需要添加显式强制转换操作符的扩展方法,是否有任何方法来实现这一点?(我已经尝试添加常规扩展方法,但没有成功)
public static explicit operator MembershipUser(this MembershipUser membership, User user)
{
return new MembershipUser("SimplyMembershipProvider", user.UserName, user.UserId, user.Email, null, null, user.IsApproved, user.IsLocked,
user.CreateDate, user.LastLoginDate, user.LastActivityDate, user.CreateDate, DateTime.MinValue);
}
我该如何解决这个问题?
不能通过扩展方法重载操作符。
最好使用扩展方法:
public static MembershipUser ConvertToMembershipUser(this User user)
{
return new MembershipUser("SimplyMembershipProvider",
user.UserName,
user.UserId,
user.Email,
null,
null,
user.IsApproved,
user.IsLocked,
user.CreateDate,
user.LastLoginDate,
user.LastActivityDate,
user.CreateDate,
DateTime.MinValue);
}
MembershipUser membershipUser = aUser.ConvertToMembershipUser();
正如其他人所说,您不能使用扩展方法重载操作符-但是一个简单的扩展方法仍然是有用的:
public static MembershipUser ToMembershipUser(this User user)
{
return new MembershipUser("SimplyMembershipProvider",
user.UserName, user.UserId, user.Email, null, null,
user.IsApproved, user.IsLocked, user.CreateDate,
user.LastLoginDate, user.LastActivityDate, user.CreateDate,
DateTime.MinValue);
}
则直接使用
User user = ...;
MembershipUser membershipUser = user.ToMembershipUser();
我个人认为这比使用显式转换更清晰——我很少使用操作符重载。特别是,考虑到类听起来肯定是相关的,天真的用户可能会期望下面的代码:
User user = ...;
MembershipUser membershipUser = (MembershipUser) user;
…是一个正常的引用转换,期望MembershipUser
是由User
派生的类。这在对象标识方面很重要——如果是的情况,它不会改变所涉及的对象(并且user
引用的对象的更改仍然可以通过membershipUser
看到)。
创建ToMembershipUser
方法使您更清楚地从一个表单转换为另一个类型的新对象。所有的IMO,当然:)
不能添加扩展转换。
只有在控制其中一种类型的源代码时,才能定义显式或隐式转换。在您的情况下,您可以控制MembershipUser
或User
,您不需要同时控制两者。但是你必须控制一个。
如果两者都不控制,则只需在其他类的方法中定义转换,这些类的工作就是控制这种转换。
class UserConverter
{
public MembershipUser ConvertFrom(User user)
{
return ...
}
}
并不是说这是一种好做法(请参阅其他答案,了解为什么不应该这样做,但如果类没有密封,这是可能的,只是不使用扩展方法)。
基本上,您可以创建继承User的代理类,User定义了强制转换操作符,类似于: class UserSurrogate : User
{
public static explicit operator UserSurrogate(MemberShipUser other)
{
return new UserSurrogate() { Name = other.Name };
}
}
class User
{
public string Name { get; set; }
}
class MemberShipUser
{
public string Name { get; set; }
}