Is it possible to dynamically capture a static class using an enumeration?

I want to create a configuration for my application using static classes.

First, forgive my ignorance, I'm not a full-time C # dev. I come from the world of Ruby / Javascript, where dynamic access to constants and variables is trivial.

Is this the right approach here, I'm not 100% right now. Other suggested approaches would be helpful.

I have the following static class setting for my config:

public static class Config
{
    public static class MaterialQuality
    {
        public static class Low
        {
            public const float Value = 0.1f;
            public const int Cost = 10;
        }

        public static class Medium
        {
            public const float Value = 0.2f;
            public const int Cost = 20;
        }

        public static class High
        {
            public const float Value = 0.2f;
            public const int Cost = 40; 
        }
    }
}

Then I have a class Materialto which the enumeration value relating to types is transferred Low,Medium,High. The reason for enumunity is that it provides a quick way for developers to provide level developers with a list of options for an object.

, , , , . .

- Cost Value MaterialQuality.

public enum MaterialQuality
{
    Low,Medium,High 
}

public class Material
{
    private int Cost;
    private float Value;

    Material(MaterialQuality quality) {

        Cost = Config.MaterialQuality.<quality>.Cost;
        Value = Config.MaterialQuality.<quality>.Value;

        //in Javascript I'd use associative array access to the object
        Cost = Config.MaterialQuality[quality].Cost;

        //in Ruby we have const_get() on classes.
        Cost = Config.MaterialQuality.const_get(quality).Cost

    }

}

. , intellisense.

+4
6

.

void Main()
{
    var config = Config.Qualities[MaterialQualities.Low];
    var cost = config.Cost;
    var value = config.Value;
}

public static class Config
{
    public static Dictionary<MaterialQualities, MaterialQuality> Qualities =
        new Dictionary<MaterialQualities, MaterialQuality>
        {
            { MaterialQualities.Low, new MaterialQuality { Value = 0.1F, Cost = 10 }},
            { MaterialQualities.Medium, new MaterialQuality { Value = 0.2F, Cost = 20 }}, 
            { MaterialQualities.High, new MaterialQuality { Value = 0.2F, Cost = 40 }},
        };  
}

public class MaterialQuality
{
    public float Value { get; set; }
    public int Cost { get; set; }
}

public enum MaterialQualities
{
    Low, Medium, High
}
+2

, :

public static class Config
{
    public class Material
    {
        public Material(float value, int cost){
            Value = value;
            Cost = cost;
        }

        public float Value {get; private set;}
        public int Cost {get; private set;}

        public Material GetFor(MaterialQuality quality){
             switch(quality){
                 case MaterialQuality.Low: return new Material(0.1f, 10);
                 case MaterialQuality.Medium: return new Material(0.2f, 20);
                 case MaterialQuality.High: return new Material(0.2f, 40);
             }
             throw new Exception("Unknown material quality " + quality);
        }

    }
}

:

    //....
    Material materialData = Material.GetFor(quality);
    Cost = materialData.Cost;
    Value = materialData.Value;
    //...
+1

MaterialQuantity enum. - :

public struct MaterialQualityInfo
{
    public MaterialQualityInfo( float value, int cost )
    {
        Value = value;
        Cost = cost;
    }

    public float Value { get; private set; }
    public int Cost { get; private set; }
}

public static class Config
{
    public static class MaterialQuality
    {
        public static MaterialQualityInfo Low
        {
            get { return new MaterialQualityInfo( 0.1f, 10 ); }
        }

        public static MaterialQualityInfo Medium
        {
            get { return new MaterialQualityInfo( 0.2f, 20 ); }
        }

        public static MaterialQualityInfo High
        {
            get { return new MaterialQualityInfo( 0.2f, 40 ); }
        }
    }
}

public class Material
{
    private int Cost;
    private float Value;

    Material( MaterialQualityInfo quality )
    {

        Cost = quality.Cost;
        Value = quality.Value;

    }
}
+1

IMHO, . - .

, 2 : Value Cost. , MaterialQuality:

public class MaterialQuality
{
     public float Value { get; set; }
     public int Cost { get; set; }
}

, , Configuration :

public class Configuration
{
    public List<MaterialQuality> MaterialQualities { get; } = new List<MaterialQuality>();
}

... , Configuration, :

public class Configuration
{
    private readonly static Configuration _current = new Configuration();

    public static Configuration Current => _current;

    public List<MaterialQuality> MaterialQualities { get; } = new List<MaterialQuality>();
}

, :

Configuration.Current.MaterialQualities.Add(new MaterialQualities { Value = 0.1f, Cost = 10 });

API , : MaterialQualities ImmutableList<T> ( ) AddMaterial:

public class Configuration
{
    private readonly static Configuration _current = new Configuration();
    private readonly List<MaterialQuality> _materialQualities = new List<MaterialQuality>();

    public static Configuration Current => _current;

    public IImmutableList<MaterialQuality> MaterialQualities => _materialQualities.ToImmutableList();

    public Configuration AddMaterial(float value, int cost)
    {
         _materialQualities.Add(new MaterialQuality { Value = value, Cost = cost });

         return this;
    }
}

... !

Configuration.Current.AddMaterial(0.1f, 10)
                     .AddMaterial(0.2f, 20)
                     .AddMaterial(0.2f, 40);
+1

:

public enum MaterialQuality
{
    Low, Medium, High
}

public class Material
{
    private int Cost;
    private float Value;
    private readonly Dictionary<MaterialQuality, Tuple<int, float>> storageMap = new Dictionary<MaterialQuality, Tuple<int, float>>
    {
        { MaterialQuality.Low, Tuple.Create(10, 0.1f)},
        { MaterialQuality.Low, Tuple.Create(20, 0.2f)},
        { MaterialQuality.Low, Tuple.Create(40, 0.2f)},
    }; 

    public Material(MaterialQuality quality)
    {

        Cost = storageMap[quality].Item1;
        Value = storageMap[quality].Item2;
    }

}
0

enum , - :

public class Material
{
   public float Value { get; private set; }
   public int Cost { get; private set; }
   public Material(float value, int cost)
   {
     Value = value;
     Cost = cost;
   }
   public static Material Low { get { return new Material(0.1f, 10); } }
   public static Material Medium { get { return new Material(0.2f, 20); } }
   public static Material High { get { return new Material(0.2f, 40); } }
}

:

var myLowMaterial = Material.Low;
var myMediumMaterial = Material.Medium;
var myHighMaterial = Material.High;

enum -, :

 public static Material Get(MaterialQuality quality)
 {
   switch(quality)
   {
     case MaterialQuality.Low: 
        return Low;
     case MaterialQuality.Medium: 
        return Medium;
     case MaterialQuality.High: 
        return High;
   }
   throw new Exception("We should never go here");
}
0

Source: https://habr.com/ru/post/1625881/


All Articles