Jos*_*eld 3 c# reflection .net-3.5
我有一堂课,我正在用反思做一些漂亮的事情.
现在,当我使用反射为类的字段赋值时,我需要添加一些与特定字段关联的元数据(我不知道该类是什么).
我想这样做,没有客户对我的实施知道(必须做他们自己的特殊事情).
在类中具有指定的"元"字段或对象将起作用,但是不会感觉非常优雅,因为它要求子类做一些"兼容"的事情.我想动态地将这个元信息附加到现有的类,但仍然允许它被视为与应用程序的其余部分相同的类.我希望以后能够恢复这个元信息.
*此过程在正常操作和类的对象类型方面应该没有副作用.对于一般应用,该类应该在之前和之后相同.
细分到最简单的术语,我基本上在寻找一种方法来"回送"任何类实例上的额外信息,而无需特殊的编译时修改.
我意识到这是一个奇怪的问题,有一些奇怪的约束,但可以做到吗?
您最好的选择是对该字段使用自定义属性.
1)所以创建属性:
[AttributeUsage(AttributeTargets.Field)]
public class MyCustomAttribute : Attribute
{
}
Run Code Online (Sandbox Code Playgroud)
2)装饰领域:
class MyClass
{
[MyCustomAttribute]
private int _myField;
....
}
Run Code Online (Sandbox Code Playgroud)
3)然后在你的反思中:
if(fieldInfo.GetCustomAttributes(typeof(MyCustomAttribute), true).Length>0)
{
...
}
Run Code Online (Sandbox Code Playgroud)
如果数据是实例的一部分那么
第二种方法是首先想到并且直截了当的方法.在第一个音符上,可以
Metadata<T>,它将为所有类型提供此类功能我倾向于喜欢第三种可以封装反映类型T并创建必要的占位符来存储额外状态.这个问题的主要问题是你不能将类型作为参数传递给方法.这似乎是第二种解决方案最实用的.