I'm trying to write a method that takes references to boolean flags and modify them. The booleans are all declared separately (i.e. not in an indexable data structure) and the caller of the method should be able to decide which booleans are being modified.
Example code (this works):
class Program
{
private static bool b1, b2, b3, b4, b5;
private static void doSomething(ref bool setTrue, ref bool setFalse, ref bool invert)
{
setTrue = true;
setFalse = false;
invert = !invert;
}
static void Main(string[] args)
{
Console.WriteLine("Pre: {0}, {1}, {2}, {3}, {4}", b1, b2, b3, b4, b5);
doSomething(ref b1, ref b3, ref b5);
Console.WriteLine("Post: {0}, {1}, {2}, {3}, {4}", b1, b2, b3, b4, b5);
}
}
Output, as expected:
Pre: False, False, False, False, False
Post: True, False, False, False, True
So far, so good. Now these parameters should be optional on the method. That is, the caller can choose to e.g. use the setTrue
and the invert
effect, but not the setFalse
one.
Basically, what I'd like to do is this:
doSomething(ref b1, null, ref b5); // error CS1503: Argument 2: cannot convert from '<null>' to 'ref bool'
And then declare the doSomething
method like this:
private static void doSomething(ref bool setTrue, ref bool setFalse, ref bool invert)
{
if(setTrue != null) setTrue = true;
if(setFalse != null) setFalse = false;
if(invert != null) invert = !invert;
}
Note that I do not want to check if the value is null. The values are real bools and can't be null (and declaring them as bool?
doesn't really solve my problem). I only want to give the caller the ability to give null as the reference.
While the implementation of the method may be more complex, I'd really like to keep the invocation down to one line. (I.e. avoid having to declare temporary variables just for this call.)
One possibility would be to declare (eight) overloads for the function with all combinations of bools given or not, but then I need to come up with some scheme to make sure they all have unique signatures. (I'm stuck with C# 3.0, so no named parameters.)
Am I missing something? Is there a clean workaround? Currently the only (barely) acceptable alternative I can think of is to pass in strings with the variable names (or null) and then resolve these to the actual field using reflection.
PS: As you're probably wondering why I trying to do something this strange, some words of background: the doSomething
method is part of a library. The invocations of doSomething
are coming from generated C# code. And yes, having all these bools (~200 in the real project) as separate fields does make sense in the big picture, but the reasoning isn't really relevant for this question.