我正在使用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;
...
}
}
进入更通用的东西,我在其中动态构建索引和'setter'之间的映射:
但是如果有更简洁的话会更好:
PropMapper mappers[] = {
new PropMapper("Prop1", ResultType.Prop1 ),
new PropMapper("Prop2", ResultType.Prop2 ),
....
};
但是,我不知道如何从PropMapper
的属性创建ResultType
。
问题:
如何生成包装/委托给定类型属性的对象?
注意:尽管ORM对此非常有用,但我实际上只是询问C#如何允许创建委托(或任何等效的)
答案 0 :(得分:2)
PropMapper需要接收lambda expression作为参数,表示属性。 Prism的NotificationObject在其RaisePropertyChanged事件中收到这样的表达。
您可以查看Prism's source code如何使用lambda表达式提取属性并使用它。
答案 1 :(得分:1)
您可以尝试使用Reflection:
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);
}
答案 2 :(得分:0)
你可能想看看像dapper
这样的小型游戏