当我为类的字段赋值时,添加与特定字段关联的一些元数据?

我有一堂课,我正在用反思做一些漂亮的事情。

现在, 当我使用reflection为类的字段赋值时,我需要添加一些与特定字段关联的元数据 (我不知道该类是什么)。

我想这样做,没有客户对我的实施知道(必须做他们自己的特殊事情)。

在类中具有指定的“元”字段或对象将起作用,但是不会感觉非常优雅,因为它要求子类做一些“兼容”的事情。 我想动态地将这个元信息附加到现有的类,但仍然允许它被视为与应用程序的其余部分相同的类。 我希望以后能够恢复这个元信息。

  • 类被传入
  • 通过附加元信息的reflection来分配(映射)值
  • class级归来

*此过程在正常操作和类的对象类型方面应该没有副作用。 对于一般应用,该类应该在之前和之后相同。

  • 应用程序对类进行“正常”工作(分配值,获取值,validation信息等)。
  • 类将在稍后传回
  • 使用值和元信息来执行某些操作

细分到最简单的术语,我基本上在寻找一种方法来“回送”任何类实例上的额外信息,而无需特殊的编译时修改。

我意识到这是一个奇怪的问题,有一些奇怪的约束,但可以做到吗?

如果您需要每种类型的额外状态而不是实例,则这适用

您最好的选择是对该字段使用自定义属性。

1)所以创建属性:

[AttributeUsage(AttributeTargets.Field)] public class MyCustomAttribute : Attribute { } 

2)装饰领域:

 class MyClass { [MyCustomAttribute] private int _myField; .... } 

3)然后在你的反思中:

 if(fieldInfo.GetCustomAttributes(typeof(MyCustomAttribute), true).Length>0) { ... } 

如果它必须在实例中

如果数据是实例的一部分那么

  • 任一实例都需要允许其存储
  • state需要存储在像字典这样的单独类中

第二种方法是首先想到并且直截了当的方法。 在第一个音符上,人们可以

  • 将状态定义为可以保存信息的单独属性 。 这是你建议的那个,你不满意。
  • 从提供额外function的基类inheritance
  • 创建一个generics类型 ,例如Metadata ,它将为所有类型提供此类function

我倾向于喜欢第三个可以封装反映类型T并创建必要的占位符来存储额外状态。 这个问题的主要问题是你不能将类型作为参数传递给方法。 这似乎第二种解决方案是最实用的。

我倾向于创建一个字典,其中对象实例作为键,元数据作为值。 您可能需要小心确保使用ReferenceEquals()而不是Equals()确定相等性。 您可能还需要一个包含对象和相关PropertyInfo的复合键。

如果元数据需要将对象跟随到元数据字典不可用的某些上下文中,则此方法也不起作用。