L'accès à l'intérieur des classes à partir d'un autre projet
Je me demandais si il était possible d'accéder à une classe interne des variables à partir d'autres projet en c#. Je sais que c'est impossible dans l'utilisation régulière, je l'expliquer ci-dessous.
J'ai un projet (P1 [bibliothèque de classe]) contenant ces classes...
internal class Settings
{
public static long size {get;set;}
public static DoSomethingInternalOnly()
{
}
}
public class Program
{
public static Main()
{
}
}
... et un autre (P2) contenant:
public class Program
{
public static Main()
{
//P1.CopyOfSettings.size = 2048; ???
}
}
Dans les Paramètres de la classe-je stocker des variables internes (et les méthodes) pour les applications qui ne peut pas être visibles à partir d'autres projets. Mais ces paramètres doivent être passés en quelque sorte de P2 à P1, donc j'ai besoin de deuxième classe "Settings2" en P2 contenant les mêmes variables (variables seulement!) "Paramètres" avec mot-clé public.
J'ai l'impression que la création de plusieurs classes contenant les mêmes variables est une perte de temps et rend le code illisible. Est-il meilleure façon d'accomplir cette?
Settings
à être adoptée? Si ils sont sérialisés par Program1
, alors peut-être vous pouvez désérialiser dans Program2
? Les deux projets peuvent partager définition de classe pour uniquement les paramètres (méthodes sont exclusifs pour Program1
ensuite).j'ai l'impression que la création de plusieurs classes contenant les mêmes variables est une perte de temps et rend le code illisible. Est-il meilleure façon d'accomplir cette?</j'ai> Donc créer une catégorie distincte lib communs classes.
Cela semble très étrange pour moi. Si une classe ou d'un membre est
internal
son ment être utilisées uniquement au sein d'une assemblée. Si vous avez besoin d'accéder de l'extérieur de l'assemblée de faire de la classe publique.OriginalL'auteur Adam Mrozek | 2014-02-03
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser le InternalsVisibleTo attribut et de donner le nom d'un montage spécifique qui peut voir le
internal
types dans votre assemblée.Cela dit.. je pense que vous êtes en bordure de la conception de ce. Si le
Settings
classe n'appartient qu'à l'Assemblée Une... à ne pas le placer dans l'Assemblage de B... le mettre dans de l'Assemblée A.J'ai un projet partagé qui, selon la documentation compile les unités dans la même assemblée. Je me serais attendu à l'interne pour être admis, mais je reçois l'erreur. Quelqu'un a déjà essayé interne avec un projet partagé (j'.e.pas une assemblée distincte, mais encore obtenir l'erreur)
OriginalL'auteur Simon Whitehead
Oui, il est, à l'aide de InternalsVisibleTo, mais je ne le recommande de le faire pour de Test de l'Unité des projets.
Sinon, vous devez extraire une interface commune, le rendre public et de le mettre dans une autre assemblée qui peuvent être des références par les deux projets.
Vous pourriez faire toutes les propriétés de l'interface en lecture seule afin que le consommateur ne peut pas les modifier.
OriginalL'auteur Matthew Watson
Je pense que c'est ce que vous cherchez:
http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute.aspx
OriginalL'auteur Trifon
C'est le point de
internal
modificateur - pour ne pas permettre cela. Soit changer de public ou de l'utilisation une sorte de classe de proxy pour exposer les fonctionnalités dont vous avez besoin pour le monde extérieur.je n'ai jamais dit le contraire? Ce n'est pas une bonne approche, à mon avis, toutefois, si vous devez utiliser plus tard dans plusieurs assemblées? Allez-vous continuer à ajouter des attributs supplémentaires pour répondre aux besoins? Interne modificateur a été introduite pour empêcher l'accès de l'extérieur et cet attribut est juste une excuse pour les gens paresseux qui ne peut pas créer de la bonne architecture pour leurs logiciels. Comme Matthew Watson a dit, il ne devrait pas être utilisé en dehors des tests unitaires et des situations similaires...
Bien sûr, et je ne peux pas être contre cette idée. Je suis en désaccord avec votre réponse à cette question, c'est tout.
OriginalL'auteur walther