C# 使用Dapper绑定具有附加动态属性的强类型模型
我们希望能够使用它为我们的业务模型提供对象关系映射 与这些数据模型一起,我们经常遇到由用户创建的自定义字段(在运行时未知),这些字段显示为返回结果集的一部分:C# 使用Dapper绑定具有附加动态属性的强类型模型,c#,dynamic,dapper,strong-typing,C#,Dynamic,Dapper,Strong Typing,我们希望能够使用它为我们的业务模型提供对象关系映射 与这些数据模型一起,我们经常遇到由用户创建的自定义字段(在运行时未知),这些字段显示为返回结果集的一部分: Id Title c_MyCustomField1 c_MyCustomField2 目前,所有这些字段都由读取器返回和处理。我们想把这一切都转移到,但很难解决如何将强类型对象与动态自定义字段混合在一起的问题 我们的选择如下: class Model { int Id {get; set;} string Title {
Id
Title
c_MyCustomField1
c_MyCustomField2
目前,所有这些字段都由读取器返回和处理。我们想把这一切都转移到,但很难解决如何将强类型对象与动态自定义字段混合在一起的问题
我们的选择如下:
class Model
{
int Id {get; set;}
string Title {get; set;}
IList<CustomField> CustomFields {get; set;}
}
class CustomField : dynamic
{
string Name {get; set;}
object Value {get; set;}
}
class Model
{
int Id {get; set;}
string Title {get; set;}
IList<CustomField> CustomFields {get; set;}
}
class CustomField : dynamic
{
string Name {get; set;}
object Value {get; set;}
}
类模型
{
int Id{get;set;}
字符串标题{get;set;}
IList自定义字段{get;set;}
}
类CustomField:动态
{
字符串名称{get;set;}
对象值{get;set;}
}
有没有什么方法可以用Dapper来完成
一如既往,我们非常感谢您的任何建议。这些建议目前还不能以整洁的方式进行建模;您可以使用非泛型API执行某些操作,然后手动应用绑定。或者只包装一个动态:
class Model {
private dynamic obj;
public int Id { get { return obj.Id; } set { obj.Id = value; } }
public string Title { get { return obj.Title; } set { obj.Title = value; } }
public object this[string key] {
get { return ((IDictionary<string,object>)obj)[key]; }
set { ((IDictionary<string,object>)obj)[key] = value; }
}
}
类模型{
私有动态对象;
公共int Id{get{return obj.Id;}set{obj.Id=value;}
公共字符串Title{get{return obj.Title;}set{obj.Title=value;}}
公共对象此[字符串键]{
获取{return((IDictionary)obj)[key];}
set{((IDictionary)obj)[key]=value;}
}
}
使用
Query
可以获得dynamic
/IDictionary
,而无需指定泛型参数。有趣的是,“clean”是一个在讨论这个问题时经常出现的形容词。你的建议肯定让人觉得,如果我们决定迈出这一步,这应该是我们前进的方向。感谢您的时间。我们现在有没有更好的方法在最新版本的Dapper中绑定?@CoderAbsolute当前没有,现在没有,我的整个应用程序都在Dapper上。很抱歉抓住这个线程,但我想将我的模型(强类型)转换为dapper和SimpleCRUD接受的匿名类型。你有更干净的方法吗?@CoderAbsolute-dapper如果你把你的模型传给它,它会尽力挑选要发送的成员,等等