What is the best solution to this problem? I am trying to create a function that has several optional class type parameters for which null is a significant value and cannot be used as the default value. As in,
public void DoSomething (Class1 optional1, Class2 optional2, Class3 optional3)
{
if (! WasSpecified (optional1)) {optional1 = defaultForOptional1; }
if (! WasSpecified (optional2)) {optional2 = defaultForOptional2; }
if (! WasSpecified (optional3)) {optional3 = defaultForOptional3; }
// ... do the actual work ...
}
I cannot use Class1 optional1 = null
because null makes sense. I cannot use the instance of the placeholder class Class1 optional1 = defaultForOptional1
due to the constant compile-time constant for these additional parameters. I came up with the following options:
- Provides overloads with any possible combination, which means 8 overloads for this method.
- Include a boolean parameter for each optional parameter, indicating whether to use the default value, which I block the signature.
Has anyone out there come up with some kind of smart solution for this?
Thanks!
edit: I ended up writing a wrapper class, so I didn't have to repeat Boolean HasFoo
.
/// <summary> /// A wrapper for variables indicating whether or not the variable has /// been set. /// </summary> /// <typeparam name="T"></typeparam> public struct Setable<T> { // According to http://msdn.microsoft.com/en-us/library/aa288208%28v=vs.71%29.aspx, // "[s]tructs cannot contain explicit parameterless constructors" and "[s]truct // members are automatically initialized to their default values." That fine, // since Boolean defaults to false and usually T will be nullable. /// <summary> /// Whether or not the variable was set. /// </summary> public Boolean IsSet { get; private set; } /// <summary> /// The variable value. /// </summary> public T Value { get; private set; } /// <summary> /// Converts from Setable to T. /// </summary> /// <param name="p_setable"></param> /// <returns></returns> public static implicit operator T(Setable<T> p_setable) { return p_setable.Value; } /// <summary> /// Converts from T to Setable. /// </summary> /// <param name="p_tee"></param> /// <returns></returns> public static implicit operator Setable<T>(T p_tee) { return new Setable<T> { IsSet = true , Value = p_tee }; } }
source share