I have defined a class that caches the value from the database and added implicit conversions so it works as a boolean variable. (This class is used to get/set user preferences in our projects)

 public class BoolParameter
{

    private static string _ParameterName;
    private static bool? _CurrentVal;

    public BoolParameter(string ParameterName)
    {
        _ParameterName = ParameterName;
    }

    public bool Val
    {
        get
        {
            return
                (bool)
                    (_CurrentVal ??
                     (_CurrentVal =
                         DataBaseAccesor[_ParameterName] == "Y"));
        }
        set
        {
            _CurrentVal = value;
            DataBaseAccesor[_ParameterName] = value ? "Y" : "N";
        }
    }

    //setter doesnt work, how to define the implicit operator setter without passing the parametername?
   /* static public implicit operator BoolParameter(bool value)
    {
        //being a new BoolParameter it would need parametername
        return new BoolParameter(value); 
    }*/

    //getter works fine
    static public implicit operator bool(BoolParameter parameter)
    {
        return parameter.Val;
    }
}

Usage:

BoolParameter parshowmessageafterupdate=new BoolParameter("UserParShowMessageAfterUpdate");

//later use
if(parshowmessageafterupdate)
{
 //show message x
}

//or later in Options Screen set the preference
//this part is what doesnt work
//parshowinitialmessage=true;

//i would have to do this instead:
parshowinitialmessage.Val=true;

How to define the implicit operator setter without passing the parametername? Would this cache class be optimum vs accessing the database directly each time you read/get the parameter?

1

There are 1 best solutions below

1
On

Why the nullable bool?

Couldn't you use:

public class BoolParameter
{

    private static string _ParameterName = String.Empty;
    private static bool _CurrentVal = false;

    public BoolParameter(string ParameterName)
    {
        _ParameterName = ParameterName;
    }

    public bool Val
    {
        get
        {
            return DataBaseAccesor[_ParameterName].Equals("Y").Equals(_CurrentVal);
        }
        set
        {
            _CurrentVal = value;
            DataBaseAccesor[_ParameterName] = value ? "Y" : "N";
        }
    }