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;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
}
|