1 /* ****************************************************************************
\r
3 * Copyright (c) Microsoft Corporation. All rights reserved.
\r
5 * This software is subject to the Microsoft Public License (Ms-PL).
\r
6 * A copy of the license can be found in the license.htm file included
\r
7 * in this distribution.
\r
9 * You must not remove this notice, or any other, from this software.
\r
11 * ***************************************************************************/
\r
13 namespace System.Web.Mvc {
\r
16 using System.Threading;
\r
18 internal static class DescriptorUtil {
\r
20 public static TDescriptor[] LazilyFetchOrCreateDescriptors<TReflection, TDescriptor>(ref TDescriptor[] cacheLocation, Func<TReflection[]> initializer, Func<TReflection, TDescriptor> converter) {
\r
21 // did we already calculate this once?
\r
22 TDescriptor[] existingCache = Interlocked.CompareExchange(ref cacheLocation, null, null);
\r
23 if (existingCache != null) {
\r
24 return existingCache;
\r
27 TReflection[] memberInfos = initializer();
\r
28 TDescriptor[] descriptors = memberInfos.Select(converter).Where(descriptor => descriptor != null).ToArray();
\r
29 TDescriptor[] updatedCache = Interlocked.CompareExchange(ref cacheLocation, descriptors, null);
\r
30 return updatedCache ?? descriptors;
\r