9

我正在使用一些程序集中的类(源代码不可用),所以无法更改他们的代码我需要为显式转换运算符添加扩展方法,有什么办法可以实现吗?(我尝试添加为常规扩展方法,但没有成功)

 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);
    }

我该如何解决这个问题?

4

4 回答 4

14

您不能通过扩展方法重载运算符。

最好使用扩展方法:

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();
于 2011-11-29T06:12:47.983 回答
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);
}

然后将其用作:

User user = ...;
MembershipUser membershipUser = user.ToMembershipUser();

就个人而言,我发现这比使用显式转换更清楚 - 我很少进行运算符重载。特别是,考虑到这些类听起来确实相关,天真的用户可能会期望以下代码:

User user = ...;
MembershipUser membershipUser = (MembershipUser) user;

... 是一个正常的引用转换,期望MembershipUser是一个派生自User. 这在对象身份方面很重要 - 如果这种情况,它不会更改所涉及的对象(并且对 by 引用的对象的更改user仍然可以通过 看到membershipUser)。

创建ToMembershipUser方法可以更清楚地表明您正在从一种形式转换为另一种类型的新对象。当然,所有 IMO :)

于 2011-11-29T06:18:28.123 回答
2

不,您不能添加扩展转换。

仅当您控制所涉及类型之一的源代码时,才能定义显式或隐式转换。在您的情况下,您可以控制其中一个MembershipUserUser,您不需要同时控制两者。但是你必须控制一个。

如果你都控制不了,你只需要在其他类的方法中定义转换,该类的工作就是控制这种转换。

class UserConverter 
{
    public MembershipUser ConvertFrom(User user) 
    {
        return ...
    }
}
于 2011-11-29T06:12:43.813 回答
1

并不是说这是一个好习惯(阅读其他答案,了解为什么不希望这样做,但如果类没有密封,这是可能的,只是不使用扩展方法)。

基本上,您可以创建一个代理类继承 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; }   
    }
于 2011-11-29T06:40:09.310 回答