Pregunta

Estoy usando la clase de algún ensamblaje (el código fuente no está disponible), por lo que no es posible cambiar el código de su que necesito agregar el método de extensión para el operador de reparto explícito, ¿hay alguna forma de lograrlo? (He intentado agregar como método de extensión regular, pero sin éxito)

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

¿Como puedo resolver esto?

¿Fue útil?

Solución

No puede sobrecargar a los operadores a través de métodos de extensión.

Lo mejor que puede hacer con un método de extensión:

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

Otros consejos

Como otros han dicho, no puede sobrecargar a los operadores utilizando métodos de extensión, pero un método de extensión simple aún sería útil:

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

Entonces simplemente úsalo como:

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

Personalmente, encuentro esto más claro que usar una conversión explícita de todos modos: rara vez voy a sobrecargar el operador. En particular, dado que las clases ciertamente sonido Relacionado, un usuario ingenuo podría esperar este código:

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

... ser una conversión de referencia normal, esperando MembershipUser ser una clase derivada de User. Esto es importante en términos de identidad de objetos, si eso fueron el caso, no estaría cambiando el objeto involucrado (y cambia al objeto mencionado por user todavía sería visible a través de membershipUser).

Creando un ToMembershipUser El método deja más claro que está convirtiendo de una forma a un nuevo objeto del otro tipo. Todos en mi opinión, por supuesto :)

No, no puede agregar una conversión de extensión.

Las conversiones explícitas o implícitas solo se pueden definir si controla el código fuente para uno de los tipos involucrados. En su caso, puede controlar MembershipUser o User, no necesitas controlar ambos. Pero tu deber controlar uno.

Si tampoco controlas, simplemente deberás definir la conversión en un método de otra clase cuyo trabajo es controlar dicha conversión.

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

No decir que esta sea una buena práctica (lea otras respuestas de por qué no debería querer esto, pero si las clases no están selladas, esto es posible, pero no utiliza métodos de extensión).

Básicamente, puede crear un usuario heredero de clase sustituta que define al operador de casting, algo así como:

    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; }   
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top