(Il s'agissait de l'original fourni avant de réaliser que la réflexion n'aiderait pas dans ce cas particulier. Voir la modification ci-dessous pour une réponse mise à jour)
Si cela ne vous dérange pas d'utiliser la réflexion, vous pouvez faire :
var data = db.Single<Demo>(d => "value" == (string)typeof(Demo).GetProperty(propname).GetValue(d));
MODIFIER
Comme d'autres l'ont laissé entendre dans les commentaires, pour que cela fonctionne avec MongoDB, vous devrez créer l'expression "à la main".
Donc, si je prends la déclaration suivante :
var data = db.Single<Demo>(d => d.prop1 == "value");
Je pense que ce qui suit devrait être équivalent, mais en construisant l'expression lambda à la main :
string propname = "prop1"; // you can now change this to any valid property name.
var parameterExpresion = Expression.Parameter(typeof(Demo), "d");
var binaryExpression = Expression.Equal(
Expression.Property(parameterExpresion, propname),
Expression.Constant("value"));
var lambda = Expression.Lambda<Func<Demo, bool>>(binaryExpression, parameterExpresion);
var data = db.Single<Demo>(lambda);
... sauf que maintenant, vous devriez pouvoir changer la valeur de propname
à n'importe quel nom de propriété valide, et cela devrait fonctionner.
Regarder à quel point le code devient verbeux lors de la construction manuelle de lambdas m'aide vraiment à apprécier toute la magie du compilateur qui se produit sans que nous ne le remarquions jamais.