这是我已经拥有的:
public class Human
{
[Mode(MaxValue = 1000)]
public Var MoneyInPocket = new Var();
[Mode(MaxValue = 75)]
public Var Age= new Var();
}
在我的方法中:
Human Eric = new Human();
Eric.MoneyInPocket = 50; //OK!
Eric.Age= 200; // It's automatically changed to 75. So it's okay too!
除了我无法在运行时更改MaxValue
以外,一切都很好。
我不想将MaxValue作为Human
或Var
类的一部分,我也不想让第二类存储我的变量,而不是类Var
。
您不能使用属性。属性必须是编译时常数。
您需要将其设置为property
,并让Setter对您配置的MaxValue
检查value
。
public string Age
{
get { return _age; }
set
{
if (value > MyConfiguration.MaxValue)
_age = MyConfiguration.MaxValue;
else
_age = value;
}
}
编辑:感谢@andris发布了一个相关问题/答案:在运行时更改属性参数
显然,如果属性可以通过反射更改其值的效果很好。我从来没有真正考虑过,尽管我从来没有真正这样做。
您的问题还不完整。
您可以使用属性而不是字段并使用[Range(0, 100)]
。
您可以将所有属性包裹在特殊类型中,该类型可以支持额外的类型(Min,Max,Max,默认值等)。或扩展Var
类以
class MyVar
{
public Var Value;
public Var Min;
public Var Max;
}
然后,您可以在一行中初始化属性(也使用构造函数过载)
public class Human
{
public Var MoneyInPocket = new Var() { Max = 1000 };
public Var Age = new Var() { Max = 75 };
}
然后,您可以在运行时更改它们,序列化/值得利化。
您仍然可以使用属性来告诉默认值值,例如 Max
。如果缺少Max
(默认值),将使用它。但是,一旦Max设置为运行时,您就不会从属性中获得价值。但是与纯财产解决方案相比,这种情况有点太多。