35 lines
1.4 KiB
C#
35 lines
1.4 KiB
C#
/* ****************************************************************************
|
|
*
|
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
*
|
|
* This software is subject to the Microsoft Public License (Ms-PL).
|
|
* A copy of the license can be found in the license.htm file included
|
|
* in this distribution.
|
|
*
|
|
* You must not remove this notice, or any other, from this software.
|
|
*
|
|
* ***************************************************************************/
|
|
|
|
namespace System.Web.Mvc {
|
|
using System;
|
|
using System.Linq;
|
|
using System.Threading;
|
|
|
|
internal static class DescriptorUtil {
|
|
|
|
public static TDescriptor[] LazilyFetchOrCreateDescriptors<TReflection, TDescriptor>(ref TDescriptor[] cacheLocation, Func<TReflection[]> initializer, Func<TReflection, TDescriptor> converter) {
|
|
// did we already calculate this once?
|
|
TDescriptor[] existingCache = Interlocked.CompareExchange(ref cacheLocation, null, null);
|
|
if (existingCache != null) {
|
|
return existingCache;
|
|
}
|
|
|
|
TReflection[] memberInfos = initializer();
|
|
TDescriptor[] descriptors = memberInfos.Select(converter).Where(descriptor => descriptor != null).ToArray();
|
|
TDescriptor[] updatedCache = Interlocked.CompareExchange(ref cacheLocation, descriptors, null);
|
|
return updatedCache ?? descriptors;
|
|
}
|
|
|
|
}
|
|
}
|