Frage

Ich verwende die Klasse aus einer Baugruppe (Quellcode ist nicht verfügbar). Daher ist es nicht möglich, den Code zu ändern. Ich muss eine Erweiterungsmethode für den expliziten Gussbetreiber hinzufügen. Gibt es eine Möglichkeit, dies zu erreichen? (Ich habe versucht, als reguläre Erweiterungsmethode hinzuzufügen, aber ohne Erfolg)

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

Wie kann ich das lösen?

War es hilfreich?

Lösung

Sie können Operatoren nicht über Erweiterungsmethoden überlasten.

Am besten können Sie mit einer Erweiterungsmethode anfangen:

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

Andere Tipps

Wie andere gesagt haben, können Sie Operatoren nicht mit Erweiterungsmethoden überlasten - aber eine einfache Erweiterungsmethode wäre immer noch nützlich:

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

Dann benutze es einfach als:

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

Persönlich finde ich dies sowieso klarer als eine explizite Konvertierung - ich gehe sehr selten für die Überlastung des Bedieners ein. Insbesondere angesichts der Tatsache, dass die Klassen sicherlich Klang Ein naiver Benutzer erwartet diesen Code möglicherweise:

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

... um eine normale Referenzumwandlung zu sein, erwartet MembershipUser eine Klasse sein, die abgeleitet ist aus User. Dies ist wichtig für die Objektidentität - wenn das ist war Der Fall würde das beteiligte Objekt nicht ändern (und Änderungen des Objekts, auf das bezeichnet wird user würde immer noch durch sichtbar sein membershipUser).

Ein ... Erstellen ToMembershipUser Die Methode macht es klarer, dass Sie von einer Form in ein neues Objekt des anderen Typs konvertieren. Alles imo natürlich :)

Nein, Sie können keine Erweiterungskonvertierung hinzufügen.

Explizite oder implizite Conversions dürfen nur definiert werden, wenn Sie den Quellcode für einen der beteiligten Typen steuern. In Ihrem Fall können Sie entweder kontrollieren MembershipUser oder User, Sie müssen beides nicht kontrollieren. Aber du muss kontrollieren Sie einen.

Wenn Sie auch nicht kontrollieren, müssen Sie lediglich die Konvertierung in einer Methode einer anderen Klasse definieren, deren Aufgabe es ist, eine solche Konvertierung zu kontrollieren.

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

Nicht zu sagen, dass dies eine gute Praxis ist (lesen Sie andere Antworten, warum Sie dies nicht wollen sollten, aber wenn die Klassen nicht versiegelt sind, ist dies möglich, nur nicht Erweiterungsmethoden).

Grundsätzlich können Sie eine Ersatzklasse erstellen, die den Benutzer erbt, der den Casting -Operator definiert, so etwas wie:

    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; }   
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top