(To był oryginał dostarczony, zanim zdaliśmy sobie sprawę, że odbicie nie pomoże w tym konkretnym przypadku. Zobacz edycję poniżej, aby uzyskać zaktualizowaną odpowiedź)
Jeśli nie masz nic przeciwko używaniu refleksji, możesz zrobić:
var data = db.Single<Demo>(d => "value" == (string)typeof(Demo).GetProperty(propname).GetValue(d));
EDYTUJ
Jak sugerowali inni w komentarzach, aby to zadziałało z MongoDB, musisz zbudować wyrażenie "ręcznie".
Tak więc, jeśli przyjmę następujące stwierdzenie:
var data = db.Single<Demo>(d => d.prop1 == "value");
Uważam, że poniższe powinno być równoważne, ale ręczne budowanie wyrażenia lambda:
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);
... z wyjątkiem tego, że teraz powinieneś być w stanie zmienić wartość propname
do dowolnej prawidłowej nazwy właściwości i powinno po prostu działać.
Patrzenie na to, jak gadatliwy jest kod podczas ręcznego budowania lambd, naprawdę pomaga mi docenić całą magię kompilatora, która dzieje się bez naszej wiedzy.