2010-03-19 2 views

Répondre

2

Non, vous devez utiliser la réflexion.
Si pourrait tout au plus créer une méthode d'extension d'aide comme dans cet exemple:

using System; 

static class Utils { 
    public static T GetProperty<T>(this object obj, string name) { 
     var property = obj.GetType().GetProperty(name); 
     if (null == property || !property.CanRead) { 
      throw new ArgumentException("Invalid property name"); 
     } 
     return (T)property.GetGetMethod().Invoke(obj, new object[] { }); 
    } 
} 

class X { 
    public string A { get; set; } 
    public int B { get; set; } 
} 

class Program { 
    static void Main(string[] args) { 
     X x = new X() { A = "test", B = 3 }; 
     string a = x.GetProperty<string>("A"); 
     int b = x.GetProperty<int>("B"); 
    } 
} 

Ce n'est pas bon, cependant. D'abord parce que vous êtes en train de transformer des erreurs de compilation lors d'erreurs d'exécution.
Deuxièmement, la performance de la réflexion est injustifiée dans ce cas. Je pense que le meilleur conseil ici est que vous ne devriez pas essayer de programmer en C# comme s'il s'agissait d'ActionScript.

+0

Thx pour la réponse. Je me demandais simplement si l'évitement de la réflexion était une option, à cause des problèmes de performance. Dans ce cas, le code serait utilisé dans une méthode récursive d'une structure d'objet composite, beaucoup utilisée. La réflexion est-elle le chemin à parcourir? –

+0

@Bert Vandamme: Je dirais d'utiliser la réflexion uniquement lorsque vous ne connaissez pas l'objet tpye a priori, mais pourriez-vous faire un exemple? –

+0

Je suppose, à un moment où vous connaissez le type de propriété, que vous devriez également connaître le type du propriétaire suffisamment pour éviter la réflexion, même si elle est abstraite d'une interface définissant cette seule propriété. :) Je suis d'accord, la réflexion ne devrait être utilisée que si vous ne savez rien du tout au moment de la compilation. – back2dos

0

Vous pouvez définir indexeur dans votre classe:

public class IndexerTest 
{ 
    private Dicionary<string, string> keyValues = new ... 

    public string this[string key] 
    { 
     get { return keyValues[key]; } 
     set { keyValues[key] = value; } 
    } 
} 

Et l'utiliser comme ceci:

string property = indexerTest["propertyName"]; 
+0

la syntaxe de parenthèse est un peu trompeuse. dans l'objet script ECMA [expression] est équivalent à object.ident, si la représentation sous forme de chaîne de l'expression est "ident". Ce que Bert semble chercher, c'est un moyen aussi court d'effectuer l'accès aux propriétés dynamiques en C#. – back2dos

Questions connexes