//--------------------------------------------------------------------- // // Copyright (c) Microsoft Corporation. All rights reserved. // // // @owner [....] // @backupOwner [....] //--------------------------------------------------------------------- using System; using System.Collections.Generic; using System.Data.Common; using System.Globalization; using System.Text; using System.Threading; namespace System.Data.Metadata.Edm { /// /// Cached dynamic method to get the property value from a CLR instance /// internal class NavigationPropertyAccessor { #region Constructors public NavigationPropertyAccessor(string propertyName) { _propertyName = propertyName; } #endregion #region Fields private Func _memberGetter; private Action _memberSetter; private Action _collectionAdd; private Func _collectionRemove; private Func _collectionCreate; private readonly string _propertyName; #endregion #region Properties public bool HasProperty { get { return (_propertyName != null); } } public string PropertyName { get { return _propertyName; } } /// cached dynamic method to get the property value from a CLR instance public Func ValueGetter { get { return _memberGetter; } set { System.Diagnostics.Debug.Assert(null != value, "clearing ValueGetter"); // It doesn't matter which delegate wins, but only one should be jitted Interlocked.CompareExchange(ref _memberGetter, value, null); } } /// cached dynamic method to set the property value from a CLR instance public Action ValueSetter { get { return _memberSetter; } set { System.Diagnostics.Debug.Assert(null != value, "clearing ValueSetter"); // It doesn't matter which delegate wins, but only one should be jitted Interlocked.CompareExchange(ref _memberSetter, value, null); } } public Action CollectionAdd { get { return _collectionAdd; } set { System.Diagnostics.Debug.Assert(null != value, "clearing CollectionAdd"); // It doesn't matter which delegate wins, but only one should be jitted Interlocked.CompareExchange(ref _collectionAdd, value, null); } } public Func CollectionRemove { get { return _collectionRemove; } set { System.Diagnostics.Debug.Assert(null != value, "clearing CollectionRemove"); // It doesn't matter which delegate wins, but only one should be jitted Interlocked.CompareExchange(ref _collectionRemove, value, null); } } public Func CollectionCreate { get { return _collectionCreate; } set { System.Diagnostics.Debug.Assert(null != value, "clearing CollectionCreate"); // It doesn't matter which delegate wins, but only one should be jitted Interlocked.CompareExchange(ref _collectionCreate, value, null); } } #endregion #region Static Properties public static NavigationPropertyAccessor NoNavigationProperty { get { return new NavigationPropertyAccessor(null); } } #endregion } }