我觉得我从过去的经历中错过了一些非常重要的东西,然而,它是:
我正在为公司内的客户设计一个使用DevExpress的最终用户报表设计器。由于这些都是动态生成的,我想让客户有机会自由选择他们在报告中的内容。我没有对所有可用的值进行硬编码,而是使用StartsWith
和Substring
来检索控件的名称。我想使用这个字符串值来指定他们需要的参数字段。我不确定我的想法是否正确,或者我是否偏离了轨道,希望有人能再看一眼,给我一些建议。
如有任何信息,我们将不胜感激。
也许我需要一本字典或某种接口?我目前拥有的代码片段如下:
private static void BuildReportHeader(Notice notice, XRControl control)
{
if (control.Name.StartsWith("lbl"))
{
string elementName = control.Name.Substring(3);
XRLabel label = (XRLabel)control;
label.Text = notice.{elementName};
}
}
显然,这并不能像现在这样工作或编译,只是在寻找{elementName}位的解决方案,这样我就可以访问该特定参数上的任何字段。
您可以使用反射来执行此动态值查找:notice.{elementName}
。
下面的示例代码假设elementName
存在并且是public
。
如果elementName是属性
var propertyValue = typeof(Notice).GetProperty(elementName).GetValue(notice);
- 请记住,
GetValue
返回object
- 上面的代码假设
elementName
属性有一个getter- 如果没有,则您将收到
ArgumentException
- 如果没有,则您将收到
如果elementName是字段
var propertyValue = typeof(Notice).GetField(elementName).GetValue(notice);
- 上面的代码假设
elementName
指向一个字段- 如果您提供了一个不存在的字段名或属性/方法名,那么您将收到一个
NullReferenceException
,因为GetField
将返回null
- 如果您提供了一个不存在的字段名或属性/方法名,那么您将收到一个