感谢大家花时间回答并讨论我的问题。
为了让您知道,我已经实施了一个足以满足我需求的解决方案。这个解决方案不是一般的,它有一些缺陷,但是我认为我可以分享它,以防它可以帮助别人。
这在原则上是什么定义字段时所使用的类的样子:
public class Unit : IUnit {
public NameOfField { get; set; }
...
}
正如你所看到的,类实现IUNIT接口,和我在NameOfField酒店所提供的公开的setter 。
的静态字段通常被定义这样一些含类中:
public static Unit Hectare = new Unit();
我的解决办法是通过反射在执行使用该字段之前设置NameOfField属性。我使用Linq来遍历相关字段的执行程序集,并且当我检测到这些字段时(字段类型实现了这些字段
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;
});
有一些缺点这种方法:
- 静态构造函数必须通过人工干预来调用IUNIT接口),我使用的任何扩展方法设置NameOfField属性为他们每个人在任何单位字段可以被访问之前
- NameOfField setter是公开的。在我的情况下,这是没有问题的,但可能是在其他情况下应用。 (我假设二传手可以通过进一步思考而变得私密并且被引用,但是我没有花时间进一步探索这条路径。)
- ...?
无论哪种方式,也许这种解决方案可以帮助别人比我。
从Unit类中无法做到这一点。如果多个变量引用同一个实例会怎么样? – Blorgbeard 2011-04-05 09:15:29
难道你不能只是将名称传递给构造函数并将其存储在单元中的字段中? '公共静态单位公顷=新单位(“公顷”);' – Henrik 2011-04-05 09:17:43
您似乎在询问您的类实例分配给的运行时变量的名称。你不能用c# – IanNorton 2011-04-05 09:22:38