Skip to content

Commit 77738a0

Browse files
marcelltothhazzik
authored andcommitted
Make persistent collection classes implement the IReadOnly* interfaces (#2284)
1 parent 99d48f5 commit 77738a0

13 files changed

+45
-13
lines changed

src/NHibernate.Test/CollectionTest/PersistentCollectionsFixture.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,5 +36,22 @@ public void AddRangeWorksCorrectly()
3636

3737
Assert.That(items, Is.EqualTo(new[] {"A", "B", "C", "D", "E"}));
3838
}
39+
40+
[Test]
41+
public void SelectManyWorksCorrectlyWithIReadOnlyCollection()
42+
{
43+
var bags = new IReadOnlyCollection<string>[]
44+
{
45+
new List<string> {"A"},
46+
new PersistentGenericBag<string>(null, new[] {"B"}),
47+
new PersistentIdentifierBag<string>(null, new[] {"C"}),
48+
(IReadOnlyList<string>)new PersistentGenericList<string>(null, new[] {"D"}),
49+
new PersistentGenericSet<string>(null, new HashSet<string> {"E"})
50+
};
51+
52+
var items = bags.SelectMany(b => b).ToArray();
53+
54+
Assert.That(items, Is.EqualTo(new[] {"A", "B", "C", "D", "E"}));
55+
}
3956
}
4057
}

src/NHibernate/Async/Collection/Generic/PersistentGenericBag.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ namespace NHibernate.Collection.Generic
2727
{
2828
using System.Threading.Tasks;
2929
using System.Threading;
30-
public partial class PersistentGenericBag<T> : AbstractPersistentCollection, IList<T>, IList, IQueryable<T>
30+
public partial class PersistentGenericBag<T> : AbstractPersistentCollection, IList<T>, IReadOnlyList<T>, IList, IQueryable<T>
3131
{
3232

3333
public override async Task<object> DisassembleAsync(ICollectionPersister persister, CancellationToken cancellationToken)

src/NHibernate/Async/Collection/Generic/PersistentGenericIdentifierBag.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ namespace NHibernate.Collection.Generic
2828
{
2929
using System.Threading.Tasks;
3030
using System.Threading;
31-
public partial class PersistentIdentifierBag<T> : AbstractPersistentCollection, IList<T>, IList, IQueryable<T>
31+
public partial class PersistentIdentifierBag<T> : AbstractPersistentCollection, IList<T>, IReadOnlyList<T>, IList, IQueryable<T>
3232
{
3333

3434
/// <summary>

src/NHibernate/Async/Collection/Generic/PersistentGenericList.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ namespace NHibernate.Collection.Generic
2727
{
2828
using System.Threading.Tasks;
2929
using System.Threading;
30-
public partial class PersistentGenericList<T> : AbstractPersistentCollection, IList<T>, IList, IQueryable<T>
30+
public partial class PersistentGenericList<T> : AbstractPersistentCollection, IList<T>, IReadOnlyList<T>, IList, IQueryable<T>
3131
{
3232

3333
//Since 5.3

src/NHibernate/Async/Collection/Generic/PersistentGenericMap.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ namespace NHibernate.Collection.Generic
2727
{
2828
using System.Threading.Tasks;
2929
using System.Threading;
30-
public partial class PersistentGenericMap<TKey, TValue> : AbstractPersistentCollection, IDictionary<TKey, TValue>, ICollection
30+
public partial class PersistentGenericMap<TKey, TValue> : AbstractPersistentCollection, IDictionary<TKey, TValue>, IReadOnlyDictionary<TKey, TValue>, ICollection
3131
{
3232

3333
//Since 5.3

src/NHibernate/Async/Collection/Generic/PersistentGenericSet.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ namespace NHibernate.Collection.Generic
2828
{
2929
using System.Threading.Tasks;
3030
using System.Threading;
31-
public partial class PersistentGenericSet<T> : AbstractPersistentCollection, ISet<T>, IQueryable<T>
31+
public partial class PersistentGenericSet<T> : AbstractPersistentCollection, ISet<T>, IReadOnlyCollection<T>, IQueryable<T>
3232
{
3333

3434
//Since 5.3

src/NHibernate/Collection/Generic/PersistentGenericBag.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ namespace NHibernate.Collection.Generic
2525
/// <remarks>The underlying collection used is an <see cref="List{T}"/></remarks>
2626
[Serializable]
2727
[DebuggerTypeProxy(typeof (CollectionProxy<>))]
28-
public partial class PersistentGenericBag<T> : AbstractPersistentCollection, IList<T>, IList, IQueryable<T>
28+
public partial class PersistentGenericBag<T> : AbstractPersistentCollection, IList<T>, IReadOnlyList<T>, IList, IQueryable<T>
2929
{
3030
// TODO NH: find a way to writeonce (no duplicated code from PersistentBag)
3131

src/NHibernate/Collection/Generic/PersistentGenericIdentifierBag.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ namespace NHibernate.Collection.Generic
3333
/// </remarks>
3434
[Serializable]
3535
[DebuggerTypeProxy(typeof (CollectionProxy<>))]
36-
public partial class PersistentIdentifierBag<T> : AbstractPersistentCollection, IList<T>, IList, IQueryable<T>
36+
public partial class PersistentIdentifierBag<T> : AbstractPersistentCollection, IList<T>, IReadOnlyList<T>, IList, IQueryable<T>
3737
{
3838
/* NH considerations:
3939
* For various reason we know that the underlining type will be a List<T> or a

src/NHibernate/Collection/Generic/PersistentGenericList.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ namespace NHibernate.Collection.Generic
2222
/// <remarks>The underlying collection used is a <see cref="List{T}"/></remarks>
2323
[Serializable]
2424
[DebuggerTypeProxy(typeof (CollectionProxy<>))]
25-
public partial class PersistentGenericList<T> : AbstractPersistentCollection, IList<T>, IList, IQueryable<T>
25+
public partial class PersistentGenericList<T> : AbstractPersistentCollection, IList<T>, IReadOnlyList<T>, IList, IQueryable<T>
2626
{
2727
protected IList<T> WrappedList;
2828

src/NHibernate/Collection/Generic/PersistentGenericMap.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ namespace NHibernate.Collection.Generic
2323
/// <typeparam name="TValue">The type of the elements in the IDictionary.</typeparam>
2424
[Serializable]
2525
[DebuggerTypeProxy(typeof(DictionaryProxy<,>))]
26-
public partial class PersistentGenericMap<TKey, TValue> : AbstractPersistentCollection, IDictionary<TKey, TValue>, ICollection
26+
public partial class PersistentGenericMap<TKey, TValue> : AbstractPersistentCollection, IDictionary<TKey, TValue>, IReadOnlyDictionary<TKey, TValue>, ICollection
2727
{
2828
protected IDictionary<TKey, TValue> WrappedMap;
2929
private readonly ICollection<TValue> _wrappedValues;
@@ -360,6 +360,16 @@ public ICollection<TValue> Values
360360
}
361361
}
362362

363+
IEnumerable<TKey> IReadOnlyDictionary<TKey, TValue>.Keys
364+
{
365+
get { return Keys; }
366+
}
367+
368+
IEnumerable<TValue> IReadOnlyDictionary<TKey, TValue>.Values
369+
{
370+
get { return Values; }
371+
}
372+
363373
#endregion
364374

365375
#region ICollection<KeyValuePair<TKey,TValue>> Members

src/NHibernate/Collection/Generic/PersistentGenericSet.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ namespace NHibernate.Collection.Generic
2121
/// </summary>
2222
[Serializable]
2323
[DebuggerTypeProxy(typeof(CollectionProxy<>))]
24-
public partial class PersistentGenericSet<T> : AbstractPersistentCollection, ISet<T>, IQueryable<T>
24+
public partial class PersistentGenericSet<T> : AbstractPersistentCollection, ISet<T>, IReadOnlyCollection<T>, IQueryable<T>
2525
{
2626
/// <summary>
2727
/// The <see cref="ISet{T}"/> that NHibernate is wrapping.

src/NHibernate/Collection/Generic/SetHelpers/ISetSnapshot.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33

44
namespace NHibernate.Collection.Generic.SetHelpers
55
{
6-
internal interface ISetSnapshot<T> : ICollection<T>, ICollection
6+
internal interface ISetSnapshot<T> : ICollection<T>, IReadOnlyCollection<T>, ICollection
77
{
88
bool TryGetValue(T element, out T value);
99
}
10-
}
10+
}

src/NHibernate/Collection/Generic/SetHelpers/SetSnapShot.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,11 @@ int ICollection<T>.Count
8383
get { return _elements.Count; }
8484
}
8585

86+
int IReadOnlyCollection<T>.Count
87+
{
88+
get { return _elements.Count; }
89+
}
90+
8691
public bool IsReadOnly
8792
{
8893
get { return ((ICollection<T>)_elements).IsReadOnly; }
@@ -101,4 +106,4 @@ public bool TryGetValue(T element, out T value)
101106
return false;
102107
}
103108
}
104-
}
109+
}

0 commit comments

Comments
 (0)