如何将元数据添加到System.Type?

时间:2017-10-06 09:07:36

标签: .net reflection f#

我一直在研究一种语言,但就.NET集成而言,到目前为止,我只是设法使原始类型工作。昨晚我有一个好主意 - 而不是试图弄清楚在类型检查期间元组,模块和函数的确切System.Type是什么,我可以做的是获得System.Type System.Object并添加一些与我自己的复杂语言类型相对应的元数据。重要的不是我要添加元数据的确切System.Type,但是我的语言中每个类型的替换都是彼此不同的。

我需要这个的原因是我使用反射命名空间中的函数进行集成,这涉及到System.Type s。{/ p>

type SpiralType =
    | IntT
    | StringT
    | TupleT of SpiralType list

作为一个例子,我想要添加到System.Type的是上述F#区别联合类型的实例,以确保唯一性。

这样做的最佳方式是什么?

1 个答案:

答案 0 :(得分:0)

使用.NET中的额外数据来扩充类型信息的标准方法是使用属性,尽管属性构造函数参数通常仅限于可以表示为文字的值。这可能是也可能不是您的问题,具体取决于您的元数据的丰富程度。 DU可能不会起作用。

否则,一个简单的解决方案是将您的值与任意元数据一起包装成通用类型,即

type TypeWithMetadata<'typ, 'metadata>(value: 'typ, metadata: 'metadata) = 
    member this.Value = value
    member this.Metadata = metadata

虽然这可能会带来你想要避免的开销吗?