(Este foi o original fornecido antes de perceber que a reflexão não ajudaria neste caso específico. Veja a edição abaixo para obter uma resposta atualizada)
Se você não se importa de usar reflexão, você pode fazer:
var data = db.Single<Demo>(d => "value" == (string)typeof(Demo).GetProperty(propname).GetValue(d));
EDITAR
Como outros sugeriram nos comentários, para fazer isso funcionar com o MongoDB, você terá que construir a expressão "à mão".
Então, se eu pegar a seguinte afirmação:
var data = db.Single<Demo>(d => d.prop1 == "value");
Acredito que o seguinte deva ser equivalente, mas construindo a expressão lambda manualmente:
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);
... exceto que agora, você deve poder alterar o valor de
propname
para qualquer nome de propriedade válido e deve funcionar. Observar o quão detalhado o código fica ao construir lambdas manualmente realmente me ajuda a apreciar toda a mágica do compilador que acontece sem que percebamos.