(Este fue el original provisto antes de darse cuenta de que la reflexión no ayudaría en este caso particular. Consulte la edición a continuación para obtener una respuesta actualizada)
Si no te importa usar la reflexión, puedes hacer:
var data = db.Single<Demo>(d => "value" == (string)typeof(Demo).GetProperty(propname).GetValue(d));
EDITAR
Como otros han insinuado en los comentarios, para que esto funcione con MongoDB, tendrá que construir la expresión "a mano".
Entonces, si tomo la siguiente declaración:
var data = db.Single<Demo>(d => d.prop1 == "value");
Creo que lo siguiente debería ser equivalente, pero construyendo la expresión lambda a mano:
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);
... excepto que ahora debería poder cambiar el valor de propname
a cualquier nombre de propiedad válido, y debería funcionar.
Ver qué tan detallado se vuelve el código cuando se construyen lambdas manualmente realmente me ayuda a apreciar toda la magia del compilador que sucede sin que nos demos cuenta.