我有一些普通的类,有一堆简单的属性(简单的{get; set;}声明).所有属性都可以为空(或等效地,引用类型).
例如:
class POCO
{
int? Field1 { get; set; }
string Field2 { get; set; }
... etc ...
}
Run Code Online (Sandbox Code Playgroud)
我有一个场景,我正在逐步构建这些POCO,最后我想让其中一个包含所有非空字段.
一些说明性代码:
POCO o1 = LoadFields1To3();
POCO o2 = LoadFields4To5();
POCO o3 = LoadFields6To9();
... etc ...
Run Code Online (Sandbox Code Playgroud)
我们处于这种情况是因为某些字段是从SQL加载的(有时是不同的查询),而有些是从内存数据结构中加载的.我在这里重新使用POCO类型来避免一堆其他无意义的类(静态类型对于Dapper来说非常有用,而且一般来说).
我正在寻找的是将这些对象的属性合并为具有非null属性的单个属性的好方法.
就像是:
POCO final = o1.UnionProperties(o2).UnionProperties(o3) // and so on
Run Code Online (Sandbox Code Playgroud)
我能够保证在多个对象上没有字段为非null.虽然我假设一个解决方案会采用最左边的非空字段,但实际上并不是必需的.
我知道我可以写一些反射代码来做到这一点,但它有点讨厌和缓慢.
这确实需要通用,因为虽然我从不打算合并不同类型的对象,但是这种方法适用的类型非常多.
我想知道是否有一些更聪明的方式,也许 AB用动态?
使用 DocumentDB 创建新文档时,我想动态设置属性名称,目前我设置SomeProperty,如下所示:
await client.CreateDocumentAsync("dbs/db/colls/x/"
, new { SomeProperty = "A Value" });
Run Code Online (Sandbox Code Playgroud)
,但我想SomeProperty从字符串中获取属性名称,以便我可以使用同一行代码访问不同的属性,如下所示:
void SetMyProperties()
{
SetMyProperty("Prop1", "Val 1");
SetMyProperty("Prop2", "Val 2");
}
void SetMyProperty(string propertyName, string val)
{
await client.CreateDocumentAsync("dbs/db/colls/x/"
, new { propertyName = val });
}
Run Code Online (Sandbox Code Playgroud)
这有可能吗?