Witam
Ostatnio modyfikując mój kod stanąłem przed problemem rzutowania obiektu typu MembershipUser(z namespaca System.Web.Security) na mój własny typ UserDTO. Klasa UserDTO nie wyróżnia się niczym specjalnym i wygląda następująco
1 2 3 4 5 6 7 8 |
public class UserDTO : UserBase { public string Id { get; set; } public string Email { get; set; } public string DisplayName { get; set; } } |
Podejściem dość oczywistym w takim przypadku jest utworzenie odpowiedniego konstruktora w klasie UserDTO, przyjmującego jako parametr obiekt typu MembershipUser. Jednakże można również utworzyć własny operator rzutowania, dzięki któremu zapis
1 2 |
MembershipUser user = new MembershipUser(/*jakies parametry*/); UserDTO dtoUser = (UserDTO) user; |
będzie poprawny. Wszystko sprowadza się do użycia dwóch słów kluczowych:
- operator
- explicit
W klasie UserDTO musimy dopisać następujący kod
1 2 3 4 5 6 7 8 9 10 11 |
public static explicit operator UserDTO(MembershipUser user) { if (user == null) throw new ApplicationException("Parametr user nie może być null-em"); return new UserDTO { Id = user.ProviderUserKey is Guid ? ((Guid)user.ProviderUserKey).ToString() : user.ProviderUserKey.ToString(), Name = user.UserName, Email = user.Email, }; } |
Jak widać tworzymy nowy operator konwersji, w którym po prawej stronie wyrażenia musi stać obiekt typu MembershipUser. Od teraz za każdym razem gdy będziemy chcieli rzutować obiekt MembershipUser na UserDTO będziemy mogli posłużyć się następującą konstrukcją.
1 |
UserDTO dtoUser = (UserDTO) membershipUser; |
>
Rzutowanie z UserDTO na MembershipUser nie jest dozwolone (przy wykorzystaniu wyżej wymienionego kodu), ale nic nie stoi na przeszkodzie aby zdefiniować drugi operator rzutowania
1 2 3 4 |
public static explicit operator MembershipUser(UserDTO userDto) { //tutaj odpowiedni kod } |
który zapewni nam konwersję odwrotną