public T Generate(object target, Random random) { var a = First.Generate(target, random); var b = Second.Generate(target, random); var tuple = new Tuple <T, T>(a, b); switch (tuple) { case Tuple <int, int> pair: return((T)(object)(pair.Item1 * pair.Item2)); case Tuple <uint, uint> pair: return((T)(object)(pair.Item1 * pair.Item2)); case Tuple <float, float> pair: return((T)(object)(pair.Item1 * pair.Item2)); default: throw new ArgumentOutOfRangeException("T can't be type " + typeof(T).Name); } }
public T Generate(object target, Random random) { var start = First.Generate(target, random); var end = Second.Generate(target, random); var tuple = new Tuple <T, T>(start, end); switch (tuple) { case Tuple <int, int> range: return((T)(object)random.Next(range.Item1, range.Item2)); case Tuple <uint, uint> range: var value = (uint)random.Next((int)range.Item1, (int)range.Item2); return((T)(object)value); case Tuple <float, float> range: return((T)(object)random.NextSingle(range.Item1, range.Item2)); default: throw new ArgumentOutOfRangeException("T can't be type " + typeof(T).Name); } }