6
votes

C # Propriétés en tant que notation de tableau

Utilisation de JavaScript, il est possible d'accéder à un objet à l'aide de la notation de point ou de la notation de tableau.

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id, FormCollection frmVals)
{
  string value;
  Owner owner = new Owner();

  foreach (var key in frmVals.AllKeys)
  {
    value = frmVals[key];
    owner[key] = value;  
  }
}


4 commentaires

Pourquoi voulez-vous utiliser cette notation?


Ne fais pas ça. Il y a peut-être d'autres scénarios légitimes, mais cela (une action de contrôleur ASP.NET MVC) n'est certainement pas l'un d'entre eux. Vous voulez vraiment vraiment valider les entrées provenant des utilisateurs sur le Web. Ne faites pas simplement que des valeurs arbitraires dans des propriétés arbitraires nommées. Cela vient de demander des problèmes de sécurité.


Merci pour cette information utile. Depuis que je suis nouveau, ma pensée était de fourrer les valeurs d'entrée dans un objet fortement dactylographié, qui lancerait une exception si les valeurs ne pouvaient pas être distribuées. Après avoir bourré les valeurs et, si aucune exception, je validerais que les valeurs de la propriété sont correctes. Une fois que tout cela est vérifié, je peux transmettre cet objet à un contrôle, qu'il a sauvegardé à DB.


Oui, vous pouvez le faire en C # 4.0 avec expandoObject, mais vous n'obtiendrez pas Intellisense sur les membres. C'est fondamentalement un objet dynamique qui implémente la natricication . msdn.microsoft.com/fr -Us / Bibliothèque / ...


5 Réponses :


1
votes

La notation de tableau JavaScript n'est pas quelque chose que vous pouvez utiliser dans c #.

Vous devez utiliser la notation de points pour accéder aux membres d'un objet. P>

Vous devrez accéder directement à chaque valeur et attribuer: p>

owner.key = frmVals[key];
owner.key2 = frmVals[key2];


0 commentaires

6
votes

Bien qu'il n'y aient aucun moyen de le faire exactement avec C #. Vous pouvez changer votre code de plusieurs manières pouvant accomplir votre objectif. Tout d'abord, vous pouvez utiliser un dictionnaire comme ceci:

var owner = new Metis.Domain.User();
var properties = owner.GetType().GetProperties();
foreach (var prop in properties) {
    object value = prop.GetValue(owner, null);
}


3 commentaires

L'approche du dictionnaire n'implique pas la fonctionnalité car elle ne fournit pas l'accès à la propriété.


Je suis d'accord, mais je pense qu'il est important de comprendre les options disponibles afin qu'il puisse évaluer le meilleur moyen de répondre à sa tâche. L'approche du dictionnaire pourrait être meilleure que d'utiliser un objet fortement dactylographié.


Je suis d'accord, je pense juste que cela pertinent que vous notez que ce n'est pas une correspondance individuelle à la fonctionnalité JavaScript décrite.



1
votes

Il n'y a pas d'équivalent syntaxique possible dans C # mais il existe des moyens d'approximer la même fonctionnalité.

Vous pouvez imiter l'accès à l'indexer de type à l'aide d'un dictionnaire , mais vous perdriez la propriété -style accès. Pour un accès de style de propriété, vous pouvez faire quelque chose de similaire en C # en utilisant un type anonyme, comme dans: xxx

Toutefois, cela ne crée pas de tableau ou autorisé le type de tableau accès et il ne permet pas de modifier le type après la création.

Pour obtenir une approximation de plus près de la fonctionnalité JavaScript, vous pourrez peut-être utiliser expandoObject pour imiter cette un peu plus étroitement, ou vous pouvez implémenter quelque chose vous-même.

Pour cela, vous auriez besoin d'une classe qui dispose d'un constructeur pour générer automatiquement des propriétés de la matrice transmise et expose un indexeur qui utilise à son tour Réflexion pour trouver la propriété nommée.

L'initialisation de ce type serait quelque chose comme: xxx

Ceci suppose qu'il y a un sous-type pour chaque définition d'élément (éventuellement en utilisant tuple ou keyvaluepair . Le constructeur prend ensuite un ienumerable de ce type.


2 commentaires

Commentaire Supprimé parce que vous avez Ninja'd votre réponse.


@Ben: J'apprécie les commentaires.



0
votes

Oui, c'est possible.

Il y a deux possibilités:

1) La liste des clés et des valeurs est dynamique.

  • La notation de la matrice est fournie par ex. system.collections.generic.dictionary
  • La notation d'accès membre peut être fournie via DLR Magic et le mot-clé dynamique .

    2) La liste des clés et des valeurs est statique.

    • La notation d'accès membre est déjà fournie par le compilateur C #.
    • La notation de tableau peut être utilisée à l'aide de la réflexion (espérons-le avec un cache pour améliorer les performances).

      Dans l'affaire statique, la notation d'accès membre est beaucoup plus rapide. Dans le cas dynamique, la notation de tableau sera un peu plus rapide.


0 commentaires

3
votes

Je ne le recommanderais pas, mais vous pouvez mettre un indexeur dans votre classe, accepter une chaîne, puis utiliser la réflexion pour lire cette propriété. Quelque chose comme: xxx


0 commentaires