我的需求是对我们使用的实体使用某种类型的元数据系统,但是是可扩展的,这意味着除了查询属性和方法之外,我们还需要支持某种自定义的元数据。标准的Type/TypeInfo类在某种程度上是有用的,但是它们不能被定制来添加特定的属性来支持我们拥有的各种模式:树节点、master-detail和其他。
Kephas.Model提供了一个复杂的基础设施来支持这类情况,包括混合和维度等高级功能,但这对我们的系统来说有点太多了。对于我们拥有的代码优先实体,我们需要更轻量级的东西。
有没有关于我们可以使用什么来满足这种需求的建议?我注意到了Kephas.Reflection名称空间,这似乎是一个合适的候选名称空间,但我不确定如何正确使用它。
发布于 2019-03-28 05:19:05
没错,Kephas.Runtime名称空间通过基础IRuntimeTypeInfo接口(在Kephas.Core包中)提供了一个轻量级的可扩展元数据。使用扩展方法访问它主要有两种方式:
// get the type information from an object/instance.
var typeInfo = obj.GetRuntimeTypeInfo();
// convert a Type/TypeInfo to a IRuntimeTypeInfo
typeInfo = type.AsRuntimeTypeInfo();从这里开始,您可以操作属性、字段、方法、注释(属性)等,通常按其名称进行索引。一个非常好的特性是IRuntimeTypeInfo是一个扩展,允许在运行时添加动态值。
请注意,IRuntimeTypeInfo专门使用ITypeInfo (在Kephas.Reflection名称空间中),这也是Kephas.Model中的基本接口。您说得对,Kephas.Model提供了更复杂的功能,这对于更复杂的元数据模型可能是有意义的,包括实体、服务、活动和您能想到的任何分类器,还可以从.NET反射之外的源(JSON、XML、数据库等)加载模型。
另一方面,在5.2.0版本之前,IRuntimeTypeInfo将由密封的RuntimeTypeInfo类实现。从版本5.3.0开始,可以提供您自己的实现,可以有多个实现。
https://stackoverflow.com/questions/55374092
复制相似问题