[英]C# accessing property values by property name
之前问过一个问题,但我的措辞不够好。 我需要访问 Mongo 数据库构建器投影实例化中的属性名称。
与编码出我想通过用户选择访问该属性的每一种可能性相比。 像这样
UserSubmittedModel s = new UserSubmittedModel
{
SensorDataChannelName = "AirTemp"
};
var projection = Builders<SensorData>.Projection.Include(u => u.GetType().GetProperty(s.SensorDataChannelName).GetValue(u, null)).Include(u => u.MainFileId).Include(u => u.UnixTime).Exclude(u => u.Id);
但是,我在执行此操作时反复遇到此错误
System.InvalidOperationException: 'Unable to determine the serialization information for u => u.GetType().GetProperty(value(Program+<>c__DisplayClass0_1).s.SensorDataChannelName).GetValue(u, null).'
我还深入研究了另一篇涉及此内容的帖子,他们从方法中返回,本质上是同一件事。 但我得到了相同的结果。
static object GetPropValue(object target, string? propName)
{
return target.GetType().GetProperty(propName).GetValue(target, null);
}
我想将用户选择转换为 model 参数名称,以便我可以投影并包含它。
根据上一个问题,我认为您正在尝试根据所选值 ( s.SensorDataChannelName
) 从SensorData
获取属性名称。
从MongoDB .NET 驱动程序文档(投影定义生成器部分) ,您可以将字段名称作为string
传递,这是 lambda 表达式的替代方法。
var projection = Builders<Widget>.Projection.Include("X")
.Include("Y")
.Exclude("Id");
用这条线:
u.GetType().GetProperty(s.SensorDataChannelName).GetValue(u, null)
它返回u./* value of s.SensorDataChannelName */
但不返回u
中的属性(名称)。
您可以直接传递字段名称,如下所示:
var projection = Builders<SensorData>.Projection
.Include(s.SensorDataChannelName)
// Following fields to be included / excluded
;
或者,如果您想先验证属性名称:
string fieldName = typeof(SensorData).GetProperty(s.SensorDataChannelName)?.Name;
if (String.IsNullOrEmpty(fieldName))
{
// TO-DO Handle Invalid field name
return;
}
var projection = Builders<SensorData>.Projection
.Include(fieldName)
.Include(u => u.MainFileId)
.Include(u => u.UnixTime)
.Exclude(u => u.Id);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.