扩展方法和显式铸造

时间:2011-11-29 06:08:03

标签: c# .net casting extension-methods 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);
    }

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:12)

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

使用扩展方法可以做到最好:

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

答案 1 :(得分: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派生的类。这在对象标识方面很重要 - 如果 这种情况,它就不会改变所涉及的对象(并且user引用的对象的更改仍然可以通过membershipUser)。

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

答案 2 :(得分:2)

不,您无法添加扩展转换。

如果您控制其中一种类型的源代码,则只能定义显式或隐式转换。在您的情况下,您可以控制MembershipUserUser,您无需同时控制它们。但你必须控制一个。

如果您既不控制,则只需要在其他类的方法中定义转换,该类的工作是控制此类转换。

class UserConverter 
{
    public MembershipUser ConvertFrom(User user) 
    {
        return ...
    }
}

答案 3 :(得分:0)

不是说这是一个很好的做法(阅读其他答案,为什么你不应该这样,但如果这些类没有密封,这是可能的,只是不使用扩展方法)。

基本上,您可以创建一个代理类继承定义转换运算符的用户,如:

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