繁体   English   中英

C# 通过属性名访问属性值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM