8
votes

Comment faire des méthodes publiques uniquement visibles en classe elle-même et en classe possédant l'objet en C #?

Mon collègue et moi avons rencontré cela lorsque vous souhaitez obtenir la liste d'invocation d'un délégué. Si vous créez un événement dans la classe X, vous pouvez accéder aux méthodes publiques de l'événement de cette classe. Mais (et s'il vous plaît ignorer des choses comme pourquoi vous auriez accès au public aux membres de la classe, ce n'est pas ce que nous demandons!), Si nous avons une classe y instanciation x et accédant à l'événement dans X, il ne peut pas Appelez n'importe laquelle des méthodes publiques telles que GetInvococationList () de l'événement. Nous voulions savoir comment cela fonctionne. Voici un échantillon de code (lisez les commentaires pour voir ce que nous entendons):

    public class X
    {
        public delegate void TestMethod();

        public event TestMethod testMethod;

        private void rubbish()
        {
            // can access testMethod.GetInvocationList() fine here
            testMethod.GetInvocationList(); 
        }
    }

    public class Y
    {
        public Y()
        {
            X x = new X();
            x.testMethod += this.test;

            // here it says testMethod can only appear on the left hand side of += or -=
            // why is this? (i.e. the below line is invalid)
            x.testMethod.GetInvocationList(); 
        }

        public void test()
        {
        }
    }


2 commentaires

Demandez-vous «Comment pourrais-je accomplir la même chose pour ma propre classe» ou «pourquoi les événements sont-ils conçus comme des événements»?


Demandez-vous comment imitez-vous ce comportement pour les autres membres du public ou comment réparer le code que vous avez posté?


4 Réponses :


0
votes

AFAIK Il s'agit uniquement d'événements uniquement, si vous supprimez "l'événement" dans la ligne, vous pouvez utiliser la méthode tout simplement bien


0 commentaires

9
votes

C'est ce que le mot clé fonctionne; C'est un modificateur qui restreint les opérations autres que l'abonnement à la classe de propriété. Si vous supprimez le mot-clé Event , vous vous retrouverez avec un délégué ordinaire que les clients en dehors de la classe peuvent appeler par E.G. la getinvocactlist () méthode sur.

dans un publier du blog , ils comparent le code IL généré pour un délégué uni et un événement et il est traité exactement le même. Le mot clé est un modificateur de compilation qui limite l'accès aux méthodes du délégué. (Il permet également d'utiliser des interfaces). Tous les détails sont dans le blog Post.


2 commentaires

Merci ANDERS! Je vais lire le blog et revenir avec des questions supplémentaires (par exemple. Est-ce quelque chose que nous pouvons faire pour nos propres méthodes ou une magie se passe lorsque le mot clé d'événement apparaît?)


@ user555265 Il sera cuit dans le compilateur, mais il peut y avoir du plaisir de post-traitement que vous pouvez faire pour que les choses se produisent au moment de l'exécution. Le code permet ici aux gens de placer des contraintes sur les énums et les délégués, et non la même tâche, mais peut-être la même solution, afin que cela mérite d'être examiné: code.google.com/p/uncrasiné-melody



1
votes

J'ai trouvé des informations à ce sujet - l'accès à cet extérieur de la classe de déclaration est très restreint - ci-dessous est du site MSDN ( Tutoriel d'événements ).

Invoquant un événement ne peut être effectué qu'à partir de la classe qui a déclaré l'événement. Accrocher à un événement de l'extérieur de la classe cela l'a déclaré, un événement ressemble à un champ, mais l'accès à cela Le champ est très restreint. Les seules choses qui peuvent être faites sont:

Composez un nouveau délégué sur ce domaine.

Supprimer un délégué d'un champ (éventuellement composite).

Ceci est fait avec les opérateurs + = et - =. Pour commencer à recevoir un événement Invocations, le code client crée d'abord un délégué du type d'événement Cela fait référence à la méthode qui devrait être invoquée à partir de l'événement. Puis il compose de déléguer à tout autre délégué que l'événement peut être connecté à l'utilisation de + =.

Plus d'informations sont disponibles sur le lien.


0 commentaires

0
votes

Pensez aux délégués séparément des événements

hmmm ... je vais prendre un waguer ici.

Mettez votre déclaration de délégation dans votre espace de noms, en dehors de toutes les classes.

  • en classe X, créez une instance de ce délégué (peu importe l'événement) et inscrivez-vous "Handlers:" (J'utilise ce terme loosly) comme vous le souhaitez.

  • créer une méthode ou une propriété publique afin que la classe y puisse obtenir (une référence à) le délégué, et donc la liste d'invocation.

  • Vous pouvez maintenant faire ce que vous voulez dans la classe Y. Vous pouvez même créer un Événement "miroir" dans la classe Y, à l'aide de la liste d'invocation de la délégation de classe X.


0 commentaires