2009-07-01 5 views
3

Y a-t-il un bon moyen de permettre à une classe donnée d'avoir accès en lecture/écriture aux propriétés d'une autre classe sans structure d'héritage entre elles? NET?Restreindre l'accès en lecture/écriture des propriétés de classe à certaines classes dans .NET

Donc, si une classe a des propriétés publiques, seule une certaine classe a une visibilité sur ces propriétés?

Si cela n'est pas possible en mode conception, alors pendant l'exécution. Je connais un moyen hokey en utilisant des drapeaux dans set et obtenir des déclarations, mais je pense qu'il y a de meilleurs moyens.

Répondre

4

Il n'y a pas d'accès friend en C#. Vous avez public/protected/internal (y compris [InternalsVisibleTo]), mais rien de plus granulaire (c'est-à-dire au niveau inter-type). Donc non.

+0

+1 pour être si précis! ;-) – Cerebrus

2

Vous pouvez implémenter cela en utilisant le mot-clé internal en C#:

Le mot-clé interne est un modificateur d'accès pour les types et les membres de type. types internes ou sont accessibles que dans les fichiers du même ensemble, comme dans cet exemple:

public class BaseClass 
{ 
    // Only accessible within the same assembly 
    internal static int x = 0; 
} 

Voir aussi: Practical usings of “internal” keyword in C#

+1

Et utilisez InternalsVisibleTo pour mettre certaines choses à la disposition d'autres assemblages. Microsoft le fait pour rendre les choses internes visibles à leurs classes de test unitaires. – RichardOD

+0

Cela fonctionne pour tout ce qui se trouve dans le même assemblage. C'est encore trop large pour moi. Je veux qu'un cours fasse confiance à une autre classe seulement. Une classe est dans la couche DAL et l'autre dans la couche de gestion. Ainsi, les placer dans le même assemblage rompra leur isolation. –

0

Si vous rendez les propriétés publiques, n'importe qui peut y accéder. Si vous les rendez internes, protégés, ou même privés, n'importe qui peut toujours y accéder en utilisant la réflexion. Si vous voulez décourager leur utilisation, utilisez interne comme Mitch suggéré.

S'il existe une raison de sécurité pour cette contrainte, utilisez Code Access Security pour protéger vos propriétés. Notez que ce n'est pas quelque chose de simple que vous pouvez assembler - il faut penser à votre modèle de sécurité et aux autorisations que vous présentez. Sachez également que cela doit être fait au niveau de l'assemblage et affectera le déploiement de votre application.

Les chances sont que vous n'avez probablement pas besoin de faire quelque chose d'aussi profond. Vous pouvez probablement "décourager" les utilisateurs d'accéder à ces propriétés en les cachant derrière une interface explicitement implémentée.

+0

Notez également que CAS n'est souvent pas actif (confiance totale, etc) –

Questions connexes