private static ParameterKey GetOrCreateComposedKey(ref ParameterComposedKey composedKey) { ParameterKey result; lock (composedKeys) { if (!composedKeys.TryGetValue(composedKey, out result)) { var keyName = composedKey.Key.Name; var builder = new StringBuilder(keyName.Length + 10 + composedKey.Name.Length); builder.Append(keyName); builder.Append('.'); builder.Append(composedKey.Name); if (composedKey.Indexer >= 0) { builder.Append('['); builder.Append(composedKey.Indexer); builder.Append(']'); } result = ComposeWith(composedKey.Key, builder); composedKeys.Add(composedKey, result); } } return(result); }
/// <summary> /// Compose a key with a name and index (e.g if key is `MyKey.MyKeyName` and name is `MyName` and index is 5, the result key will be `MyKey.MyKeyName.MyName[5]`) /// </summary> /// <typeparam name="T">Type of the key value</typeparam> /// <param name="key">The key.</param> /// <param name="name">The name to append to the key.</param> /// <param name="index">The index.</param> /// <returns>T.</returns> /// <exception cref="System.ArgumentNullException"> /// key /// or /// name /// </exception> /// <exception cref="System.ArgumentOutOfRangeException">index;Must be >= 0</exception> public static T ComposeIndexer <T>(this T key, string name, int index) where T : ParameterKey { if (key == null) { throw new ArgumentNullException("key"); } if (name == null) { throw new ArgumentNullException("name"); } var composedKey = new ParameterComposedKey(key, name, index); return((T)GetOrCreateComposedKey(ref composedKey)); }