感谢所有花时间回答和讨论我的问题的人。
只是为了让您知道,我已经实施了一个足以满足我需求的解决方案。该解决方案不是通用的,并且存在一些缺陷,但我想无论如何我都会分享它,以防它对其他人有所帮助。
原则上,定义字段时使用的类如下所示:
public class Unit : IUnit {
public NameOfField { get; set; }
...
}
如您所见,该类实现了 IUnit 接口,并且我在 NameOfField 属性中提供了一个公共设置器。
静态字段通常在某些包含类中定义如下:
public static Unit Hectare = new Unit();
我的解决方案是在实现中使用该字段之前通过反射设置 NameOfField 属性。我通过一个静态构造函数来做到这一点(当然需要在访问 Unit 字段之前调用它。我使用 Linq 遍历相关字段的执行程序集,并且当我检测到这些字段(类型实现 IUnit 接口的字段),我使用 Any 扩展方法为它们中的每一个设置 NameOfField 属性:
Assembly.GetExecutingAssembly().GetTypes().
SelectMany(type => type.GetFields(BindingFlags.Public | BindingFlags.Static)).
Where(fieldInfo => fieldInfo.FieldType.GetInterfaces().Contains(typeof(IUnit))).
Any(fieldInfo =>
{
((IUnit)fieldInfo.GetValue(null)).NameOfField= fieldInfo.Name;
return false;
});
这种方法有一些缺点:
- 在访问任何 Unit 字段之前,必须通过手动干预调用静态构造函数
- NameOfField 设置器是公开的。就我而言,这没有问题,但在其他场景中应用时可能会出现这种情况。(我假设 setter 可以设为私有并通过进一步的反射调用,但我没有花时间进一步探索这条路径。)
- ... ?
无论哪种方式,也许这个解决方案对我以外的其他人都有帮助。