(これは、この特定のケースではリフレクションが役に立たないことに気付く前に提供されたオリジナルでした。更新された回答については、以下の編集を参照してください)
リフレクションを使用してもかまわない場合は、次のことができます。
var data = db.Single<Demo>(d => "value" == (string)typeof(Demo).GetProperty(propname).GetValue(d));
編集
他の人がコメントで示唆しているように、これをMongoDBで機能させるには、「手作業で」という表現を作成する必要があります。
したがって、次のステートメントを使用すると、次のようになります。
var data = db.Single<Demo>(d => d.prop1 == "value");
以下は同等である必要があると思いますが、ラムダ式を手動で作成します:
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);
...これで、propname
の値を変更できるようになります。 任意の有効なプロパティ名に変更すると、正常に機能するはずです。
ラムダを手動でビルドするときにコードがどのように冗長になるかを見ると、気付かないうちに発生するすべてのコンパイラの魔法を理解するのに役立ちます。