2 votes

Est-il possible d'appeler un setter de propriété avec un type différent de celui de la propriété elle-même ?

J'ai une classe Layer avec une propriété Name unique qui sert d'identifiant :

public class Layer {
    public string Name { get; set; }
    ...
    // Various other properties
    ...
}

En outre, j'ai un DiagramHandler qui gère (entre autres) la gestion des couches.

public class DiagramHandler {
    private Layer _activeLayer;
    public Layer ActiveLayer {
        get { return _activeLayer; }
        set {
            Layer layer = DiagramLayers.FirstOrDefault(l => l.Name.Equals(value.Name);
            if (layer != null) {
                _activeLayer = layer;
            } else {
                // Error handling
            }
        }
    }

    public ICollection<Layer> DiagramLayers { get; set; }
}

Comme vous pouvez le voir, j'ai stocké toutes les couches possibles dans une collection au sein du gestionnaire et une seule couche active dans sa propre propriété. Si cette dernière est définie, l'un des calques de la collection est identifié et défini comme le calque actif. Maintenant, comme je n'ai besoin que du nom de la couche pour l'identifier correctement, je me demande si je ne pourrais pas transmettre une chaîne de caractères au setter de ActiveLayer au lieu d'une couche entière. Voici ce que je pourrais faire :

// Yes, the DiagramHandler is a singleton
DiagramHandler.Instance.ActiveLayer = "Background";

au lieu de le faire :

DiagramHandler.Instance.ActiveLayer = new Layer() { Name = "Background" };

Je sais que je pourrais utiliser une fonction setter (ce que je fais actuellement) mais je préférerais utiliser un simple setter de propriété et j'étais curieux de savoir s'il y a une fonctionnalité du langage que je ne connais pas ou s'il y a une solution plus élégante et plus agréable.

3voto

Une possibilité consiste à créer un opérateur de conversion personnalisé entre string y Layer en supposant que Layer est un type que vous pouvez modifier et non un type tiers.

public static explicit operator Layer(string layerName)
{
    return new Layer { Name = layerName };
}

Layer myLayer = (Layer)"Background";

Vous pouvez également utiliser la fonction implicit afin d'éviter d'avoir recours à un cast explicite.

N'oubliez pas, cependant, qu'il s'agit d'un opérateur global, et non d'une partie seulement de votre propriété.

Une alternative plus localisée consiste à utiliser une méthode telle que SetActiveLayer qui possède deux surcharges - l'une qui accepte Layer et l'autre qui accepte une chaîne de caractères et crée la couche.

1voto

Rob Points 2095

Non, ce n'est pas possible. Vous pouvez avoir une surcharge de conversion implicite sur votre fichier Layer (très nauséabond - je ne le recommande pas !), ou avoir la méthode setter comme vous l'avez actuellement.

Votre solution est la meilleure façon d'aborder le problème, sans sucre syntaxique caché, malheureusement !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X