C#从没有反射的参数传递/检索属性名称

时间:2017-07-29 01:45:53

标签: c# performance system.reflection

我想将属性传递给函数,以便函数知道属性的值和属性的名称。这样我就可以返回与属性名称匹配的错误。

我目前有这样的代码:

var userNameField = personField.GetChildField(f => f.UserName, nameof(personField.Value.UserName));

重复多次,所以第二个参数是第一个参数lambda内属性的名称。

是否可以自动执行此参数:

  1. 重复的代码消失了
  2. 属性的字符串名称是在编译时计算的,而不是每次调用的运行时间
  3. 理想情况下,我希望我的代码看起来像:

    var userNameField = personField.GetChildField(f => f.UserName);
    

    我使用Expression<Func...使用反射工作,即((MemberExpression) getPropertyFunc.Body).Member.Name;,但这太慢了,特别是将表达式编译成一个函数,我可以用它来获取属性值。

    同样,我已经阅读了这里的想法:Get name of property as a string

    有没有办法在编译时从GetChildField函数填充属性名?或者以某种方式将其编码到模型中?

2 个答案:

答案 0 :(得分:0)

可以通过以下方式实现:

Item model=new Item();    
var propertyInfo = model.GetType();    
var value=propertyInfo.GetProperty("IrrA").GetValue(model, null).ToString();

答案 1 :(得分:-1)

根据Roslyn文档herem_pZed = new sl::Camera(); sl::InitParameters zedInit; zedInit.camera_buffer_count_linux = 4; zedInit.camera_disable_self_calib = false; zedInit.camera_fps = m_zedFPS; zedInit.camera_image_flip = m_bZedFlip; zedInit.camera_linux_id = 0; zedInit.camera_resolution = (sl::RESOLUTION) m_zedResolution; zedInit.coordinate_system = sl::COORDINATE_SYSTEM::COORDINATE_SYSTEM_IMAGE; zedInit.coordinate_units = sl::UNIT::UNIT_METER; zedInit.depth_minimum_distance = m_zedMinDist; zedInit.depth_mode = (sl::DEPTH_MODE) m_zedDepthMode; zedInit.sdk_gpu_id = -1; zedInit.sdk_verbose = true; sl::ERROR_CODE err = m_pZed->open(zedInit); if (err != sl::SUCCESS) { LOG(ERROR)<< "ZED Error code: " << sl::errorCode2str(err) << std::endl; return false; } m_pZed->setConfidenceThreshold(m_zedConfidence); m_pZed->setDepthMaxRangeValue((float) m_zedMaxDist); // Set runtime parameters after opening the camera m_zedRuntime.sensing_mode = (sl::SENSING_MODE) m_zedSenseMode; m_zedRuntime.enable_depth = true; m_zedRuntime.enable_point_cloud = false; m_zedRuntime.move_point_cloud_to_world_frame = false; // Create sl and cv Mat to get ZED left image and depth image sl::Resolution zedImgSize = m_pZed->getResolution(); // Initialize color image and depth m_width = zedImgSize.width; m_height = zedImgSize.height; m_centerH = m_width / 2; m_centerV = m_height / 2; // Best way of sharing sl::Mat and cv::Mat : // Create a sl::Mat and then construct a cv::Mat using the ptr to sl::Mat data. m_pzDepth = new sl::Mat(zedImgSize, sl::MAT_TYPE_32F_C1, sl::MEM_GPU); m_gDepth = slMat2cvGpuMat(*m_pzDepth); m_gDepth2 = GpuMat(m_gDepth.size(), m_gDepth.type()); 运算符在编译时评估&#34; Semantics&#34;阅读

的部分
  

表达式的名称是常量。在所有情况下,在编译时评估nameof(...)以生成字符串。它的参数在运行时不会被评估,并且被认为是无法访问的代码(但它不会发出&#34;无法访问的代码&#34;警告)。