(Đây là bản gốc được cung cấp trước khi nhận ra rằng phản ánh sẽ không hữu ích trong trường hợp cụ thể này. Xem chỉnh sửa bên dưới để biết câu trả lời được cập nhật)
Nếu bạn không ngại sử dụng phản chiếu, bạn có thể làm:
var data = db.Single<Demo>(d => "value" == (string)typeof(Demo).GetProperty(propname).GetValue(d));
CHỈNH SỬA
Như những người khác đã gợi ý trong các nhận xét, để làm cho điều này hoạt động với MongoDB, bạn sẽ phải xây dựng biểu thức "bằng tay".
Vì vậy, nếu tôi thực hiện câu lệnh sau:
var data = db.Single<Demo>(d => d.prop1 == "value");
Tôi tin rằng những điều sau đây phải tương đương, nhưng xây dựng biểu thức lambda bằng tay:
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);
... ngoại trừ việc bây giờ, bạn có thể thay đổi giá trị của propname
đến bất kỳ tên thuộc tính hợp lệ nào và nó sẽ hoạt động.
Nhìn vào độ dài của mã khi xây dựng lambdas theo cách thủ công thực sự giúp tôi đánh giá cao tất cả những điều kỳ diệu của trình biên dịch xảy ra mà chúng tôi không bao giờ nhận ra.