2009-09-01 5 views
1

Je souhaite être en mesure d'appeler une méthode qui crée un objet et définit les propriétés de l'objet en fonction des paramètres transmis dans la méthode. Le nombre de paramètres est arbitraire, mais la capture est que je ne veux pas utiliser de chaînes. Je veux utiliser les propriétés réelles comme dans les expressions lambda.Comment définir un nombre arbitraire de propriétés sur un objet générique?

Je veux être en mesure d'appeler la méthode avec quelque chose qui pourrait ressembler à ceci:

controller.Create<Person>(f=>{f.Name = 'John', f.Age = 30}) 

ou quelque chose dans ce sens où j'utilise la référence de la propriété réelle (f.Name) au lieu d'une représentation de chaîne de la propriété.

Une autre stipulation est que je ne veux pas de travail à faire avant l'appel de la méthode. J'écris ceci dans une bibliothèque, ainsi je ne veux pas que l'utilisateur doive faire n'importe quoi sauf faire l'appel et récupérer un objet avec les propriétés placées aux valeurs passées.

Répondre

2

Vous pouvez faire quelque chose comme :

controller.Create<Person>(f => { f.Name = 'John'; f.Age = 30; }) 

La signature créer de la méthode sera:

public T Create<T>(Action<T> propertySetter) where T : class { 
    T value = ...; 
    propertySetter(value); 
    return value; 
} 

where T : class est pas strictement nécessaire ici, mais si T est un type de valeur, les modifications à ses propriétés seraient perdus.

+1

Modifier propertySetter à Func et valeur de retour; renvoyer propertySetter (value); et cela fonctionnerait pour les types de références et les types de valeurs –

+0

Rune FS: De cette façon, vous auriez besoin d'une instruction return dans le lambda. Je voulais éviter ça. –

+0

Je devais effectivement prendre le de la création pour que cela fonctionne dans mon scénario, mais cela fonctionne très bien. – Brian

Questions connexes