【发布时间】:2009-06-15 20:06:12
【问题描述】:
我有一个实现多个属性的自定义类(调用 i 字段)。属性之一是MaximumLength,它指定值可以是的最大长度。 Value 属性是一个对象,因此我可以设置为 string、int、double 等。然后我有一个类,其中包含多个 Field 类型的属性。所有 Field 属性都在构造函数中初始化,并且只能写入 Field.Value 属性。如果尝试将 Field.Value 设置为对于该字段来说太长的值并实现 INotifyPropertyChanged,我想要做的是抛出一个错误。我的问题是 Value 属性是通用 Field 类的成员,我不知道如何获取该类中的属性名称。
一个例子:
public class Customer
{
private Field _firstName = new Field(typeof(string), 20);
public Field FirstName
{
get
{
return _firstName;
}
}
}
public class Field
{
private Type _type;
private int _maximumLength;
object _value;
public Field(Type type, int maximumLength)
{
_type = type;
_maximumLength = maximumLength;
}
public Object Value
{
get
{
return _value;
}
set
{
if (value.ToString().Length > _maximumLength)
{
throw(string.Format("{0} cannot exceed {1} in length.", property name, _maximumValue);
}
else
{
_value = value;
OnPropertyChanged(property name);
}
}
}
}
希望这已经足够清楚了。
【问题讨论】:
-
最接近这一点的是实际属性的上下文访问,字段本身不会知道它的起源,毕竟-它只是一个实例..上下文的东西-即..我访问此属性以获取此字段,然后打开反射将是非常限制性的 - 与此类似的系统,如 WPF 的依赖系统证明,在这种情况下,没有比简单地以字符串形式复制名称更好的方法。或者,您可以研究诸如 postsharp 之类的面向方面的系统,它可以让您在编译时重写 IL。