委派到C#中的属性

本文关键字:属性 委派 | 更新日期: 2023-09-27 17:57:55

我正在用一个Odbc DataReader做一些事情。查询结果中的每一行都应该转换为ResultObject,如下所示:

struct ResultObject {
    public int Prop1 { get; set; }
    public string Prop2 { get; set; }
    ...
}

为了编写更多特定于领域的代码,我想转换这个代码

var query = "SELECT Prop1, Prop2, ... FROM MyTable;";
... connect, submit query
while( reader.Read() ) {
  var fieldValue = fields[ fieldindex ];
  switch( fieldindex ) {
     case( indexProp1 ): result.Prop1.Set( (int) fieldValue); break;
     case( indexProp2 ): result.Prop2.Set( (string) fieldvalue); break;
     ...
  }
}

转换为更通用的东西,在那里我动态地构建索引和"setters"之间的映射:

但如果能有更简洁的东西,比如,那就太好了

PropMapper mappers[] = {
 new PropMapper("Prop1", ResultType.Prop1 ),
 new PropMapper("Prop2", ResultType.Prop2 ),
 ....
};

然而,我不知道如何从ResultType的属性创建PropMapper

问题:

如何生成包装/委托给给定类型的属性的对象

注意:尽管ORM对此非常有用,但我实际上只是在问C#如何允许创建委托(或任何等效的)

委派到C#中的属性

PropMapper需要接收一个lambda表达式作为参数,表示属性。Prism的NotificationObject在其RaisePropertyChanged事件中接收到这样的表达式。

您可以查看Prism的源代码,了解如何使用lambda表达式提取属性并使用它。

您可以尝试使用反射:

PropertyInfo[] props = new PropertyInfo[]
{
  typeof(ResultObject).GetProperty("prop1"),
  typeof(ResultObject).GetProperty("prop2"),
};
for (int i = 0; i < props.Length; i++)
{
  props[i].SetValue(result, fieldValue, null);
}

您可能需要了解类似dapper 的小型窗体