(Ini adalah yang asli yang diberikan sebelum menyadari bahwa refleksi tidak akan membantu dalam kasus khusus ini. Lihat edit di bawah untuk jawaban yang diperbarui)
Jika Anda tidak keberatan menggunakan refleksi, Anda dapat melakukan:
var data = db.Single<Demo>(d => "value" == (string)typeof(Demo).GetProperty(propname).GetValue(d));
EDIT
Seperti yang telah diisyaratkan orang lain di komentar, untuk membuat ini berfungsi dengan MongoDB, Anda harus membuat ekspresi "dengan tangan".
Jadi, jika saya mengambil pernyataan berikut:
var data = db.Single<Demo>(d => d.prop1 == "value");
Saya percaya bahwa yang berikut ini harus setara, tetapi membangun ekspresi lambda dengan tangan:
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);
... kecuali sekarang, Anda seharusnya dapat mengubah nilai propname
ke nama properti apa pun yang valid, dan itu seharusnya berfungsi.
Melihat bagaimana kode bertele-tele saat membuat lambda secara manual sangat membantu saya menghargai semua keajaiban kompiler yang terjadi tanpa pernah kita sadari.