2017-06-23 8 views
1

J'ai une classe simple avec quelques propriétés privées et 2 propriétés publiques (valeur et type). J'essaie de trouver un moyen d'appeler l'objet pour qu'il renvoie sa propriété value sans avoir à appeler obj.value. Je ne pense pas que ce soit possible.Puis-je accéder à une propriété d'objet avec le nom de l'objet en C#?

Voici ce que je pense:

public class myclass { 
    private int property1; 
    private int property2; 
    public string value; 
    public string type; 

    public myclass(int property1, int property2, string value, string type) 
    { 
     this.property1 = property1; 
     this.property2 = property2; 
     this.value = value; 
     this.type = type; 
    } 
} 

var obj = new myclass(1, 2, "abc", "string"); 
console.write(obj.value); // returns abc 
console.write(obj.type); // returns string 
console.write(obj); // expecting abc 

Est-il possible de la dernière ligne retourne abc avec cette syntaxe?

Vous demandez pourquoi je veux réaliser quelque chose comme ça? Je construis un service avec un module de programmation Javascript. Les objets sont des variables et je veux que les utilisateurs y accèdent en écrivant simplement obj au lieu de obj.value. J'ai besoin de ce comportement en C# (et non Javascript) car le Javascript rappelle les objets backend. Si je n'avais pas à garder les propriétés privées, ce serait facile, mais je dois les avoir.

MISE À JOUR: Pour être plus clair: cette classe doit être appelé par un interpréteur JavaScript (Jint dans ce cas) et la classe doit mettre à jour la base de données si sa valeur est mise à jour, de sorte que la nécessité de les propriétés privées. Voici mon code actuel:

public class SmartNumeric : ISmartVariable 
{ 
    private Boolean _simulation; 
    private Guid UserId; 
    private long userKeyId; 
    private long variableKeyId; 
    private string Name; 
    public string type 
    { 
     get { 
      return "numeric"; 
     } 
    } 
    private float _value; 
    public float value 
    { 
     get { 
      return _value; 
     } 

     set { 
      _value = value; 

      if (!_simulation) 
       new SmartCommon().SetValue(userKeyId, variableKeyId, value.ToString()); 
     } 
    } 

    public SmartNumeric(Guid UserId, long userKeyId, long variableKeyId, string Name, float value, Boolean simulation) 
    { 
     this.Name = Name; 
     this._value = value; 
     this.UserId = UserId; 
     this.userKeyId = userKeyId; 
     this.variableKeyId = variableKeyId; 
     this._simulation = simulation; 
    } 
} 

Ainsi, par exemple, un utilisateur va écrire son propre script comme

a = 45; 

qui est plus naturel en Javascript que

a.value = 45; 

où se réfère à un objet SmartNumeric en C#. L'objet reçoit une mise à jour et c'est là que j'ai besoin de revenir à la base de données pour mettre à jour la valeur et avoir besoin des propriétés supplémentaires.

+2

Pourquoi avez-vous besoin d'avoir ce comportement? Il y a de fortes chances que vous adoptiez la mauvaise approche pour ce que vous devez accomplir. –

+0

Ce que vous demandez n'a pas de sens.Pensez à ce que les implications seraient. Cela signifie que vous ne pourrez jamais affecter 'obj' à une autre variable. par exemple. 'var obj2 = obj;' assignerait réellement 'obj.value' à' obj2'. En fait, toute expression qui fait référence à 'obj' se référerait plutôt à' obj.value'. Donc, vous ne serez jamais capable de manipuler 'obj 'du tout. – RJM

+0

Je comprends que cela n'a pas de sens mais je me demandais si un sorcier en C# pouvait trouver un truc magique d'accesseur ou quelque chose du genre. La façon la plus simple d'aborder cela est de créer un objet simple (une chaîne) mais de trouver un moyen d'y associer d'autres valeurs. Je ne peux pas simplement utiliser un tableau séparé pour garder ces propriétés parce que quand j'accède à l'objet je n'ai pas accès à ce tableau ... – pdube

Répondre

0

La réponse finale est que cela ne peut pas être fait. Une variable est une variable et un objet est un objet. Essayer d'y échapper et tricher n'apportera que d'autres problèmes et je ne vois pas comment je peux associer d'autres propriétés à une variable sans en faire un objet. Il faudra donc que ce soit un objet et la valeur sera accessible avec obj.value.

2

Oui, vous pouvez remplacer la méthode ToString dans les MyClass pour renvoyer la valeur de la propriété que vous voulez, comme

public override string ToString() 
{ 
    return this.value; 
} 

Avec cette ajouté à votre classe, la dernière ligne voulez-vous imprimer « abc »

NOTE: ce qui se passe ici est que, fondamentalement, lorsque vous appelez Console.WriteLine(<Something>), cela essaie d'appeler la méthode ToString() qui est là dans la classe Object. Maintenant, nous savons que la classe Object est la super classe de n'importe quelle classe que nous avons. Ainsi, nous remplaçons la méthode ToString() et nous renvoyons la chaîne que nous voulons renvoyer de notre classe.

Votre dernière ligne devrait être quelque chose comme Console.WriteLine(obj.ToString()).

J'espère que ça aide!

+0

Cela fonctionnera dans l'exemple donné par l'OP, mais seulement parce que 'console.write' appelle ToString() quand son argument est un objet. Cela ne fonctionnera pas dans le cas général où 'obj' est utilisé dans une expression arbitraire. Puisque le PO demande «de trouver un moyen d'appeler l'objet pour qu'il renvoie sa propriété value sans avoir à appeler obj.value», il me semble que le cas général est ce qui est demandé. Cette réponse ne répond pas vraiment à la question. – RJM

+0

Je dois aussi pouvoir faire obj1 = obj2 et définir les valeurs. J'ai donc une mauvaise approche à ce sujet. J'ai besoin de garder les propriétés associées sans classe ... Aïe ... Je pense que je vais devoir me rabattre sur obj1.value = obj2.value – pdube