2008-12-04 6 views
2

Je classe à la propriété interne:accès à la propriété interne hors du champ d'assemblage

internal virtual StateEnum EnrolmentState 
{ 
    get { ..getter logic } 
    set { ..setter logic } 
} 

Cependant, je veux être en mesure d'accéder à cette propriété à l'extérieur de l'assemblage méthode donc je crée qui retourne simplement cette propriété:

public StateEnum GetCurrentState() 
{ 
    return EnrolmentState; 
} 

Mais quand je l'appelle cette méthode de la classe en dehors de cet ensemble je reçois une exception

(System.TypeLoadException: Method 'get_EnrolmentState' on type 'EnrolmentAopProxy' from assembly '44fe776f-458e-4c5d-aa35-08c55501dd43, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is overriding a method that is not visible from that assembly.)

Il est donc possible d'accéder à un membre interne à l'extérieur de l'assemblage de quelque façon que ce soit, ou je devrais envisager une approche différente. Pour indiquer que cette classe est utilisée comme entité de mappage O/R (NPersist), elle est ignorée par le mappeur O/R pour l'injection de code de persistance.

+0

Est-ce votre code exact? Parce que EnrolmentState n'est pas mentionné dans le code spécifié, mais * est * mentionné dans le journal. –

+0

Oui vrai, j'ai ajouté juste un exemple de code alors que le code réel est la propriété interne virtuelle "EnrolmentState". Merci pour le commentaire – Aleksandar

+0

D'accord, j'ai édité ma réponse basée sur cela. –

Répondre

1

Pourquoi la propriété est-elle interne en premier lieu? Si vous voulez avoir un accès public, rendez-le public. Je suppose que vous avez un certain contrôle sur cela, car sinon vous ne seriez pas en mesure d'ajouter une méthode publique pour y accéder en premier lieu.

Si vous ne voulez que d'autres assemblages sélectionnés pour pouvoir y accéder, InternalsVisibleTo est votre ami (jeu de mots non prévu) - mais comme Erik le dit, vous devriez penser à la conception soigneusement à ce moment-là. Pour savoir pourquoi vous obtenez cette erreur particulière, il semble que votre proxy AOP essaie toujours de remplacer la propriété interne, plutôt que d'utiliser votre méthode publique. Il est difficile de savoir si vous pouvez changer cela sans en savoir plus sur votre configuration particulière - mais rendre la propriété publique est susceptible d'être une solution plus simple.

0

Cela ressemble à vous devriez reconsidérer votre choix de conception. Internal est utilisé pour éviter ce que vous essayez de faire, alors pensez plutôt à utiliser un type d'accès public aux propriétés.

Il est possible d'utiliser l'attribut InternalsVisibleTo pour créer un assemblage spécifique capable d'atteindre les propriétés internes, mais de mon point de vue c'est un mauvais design.

0

Oui Je suis d'accord que c'est un design bizarre. J'irai avec le modificateur protégé puisque l'attribut InternalVisibleTo ne fonctionne pas pour moi.

Questions connexes