Art*_*yan 8 .net c# extension-methods casting explicit-conversion
我正在使用某些程序集中的类(源代码不可用),因此无法更改其代码我需要为显式转换运算符添加扩展方法,有没有办法实现这一点?(我试图添加为常规扩展方法,但没有成功)
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);
}
Run Code Online (Sandbox Code Playgroud)
我怎么能解决这个问题?
Chr*_*ens 12
您不能通过Extension方法重载运算符.
您可以使用扩展方法做到最好:
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();
Run Code Online (Sandbox Code Playgroud)
正如其他人所说,你不能使用扩展方法重载运算符 - 但是一个简单的扩展方法仍然有用:
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);
}
Run Code Online (Sandbox Code Playgroud)
然后将其用作:
User user = ...;
MembershipUser membershipUser = user.ToMembershipUser();
Run Code Online (Sandbox Code Playgroud)
就个人而言,我发现这比使用显式转换更清楚 - 我很少进行操作符重载.特别是,鉴于班肯定的声音相关的,一个天真的用户可能希望这样的代码:
User user = ...;
MembershipUser membershipUser = (MembershipUser) user;
Run Code Online (Sandbox Code Playgroud)
...是一个正常的引用转换,期望MembershipUser是一个派生自的类User.这在对象标识方面很重要 - 如果是这种情况,则不会改变所涉及的对象(并且对所引用的对象的更改user仍将是可见的membershipUser).
创建ToMembershipUser方法可以更清楚地将您从一个表单转换为另一个表单的新对象.所有IMO,当然:)