如何将我的类型限制为不高于 1000 的值并在运行时更改最大可能值?



这是我已经拥有的:

    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作为HumanVar类的一部分,我也不想让第二类存储我的变量,而不是类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设置为运行时,您就不会从属性中获得价值。但是与纯财产解决方案相比,这种情况有点太多。

最新更新