扩展方法和显式铸造

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)


Jon*_*eet 6

正如其他人所说,你不能使用扩展方法重载运算符 - 但是一个简单的扩展方法仍然有用:

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,当然:)