Skip to content

Commit 902e0e9

Browse files
Add [NotNull] attribute (#100)
* Add `[NotNull]` * Update Nuspec
1 parent 6dbb23e commit 902e0e9

File tree

7 files changed

+169
-13
lines changed

7 files changed

+169
-13
lines changed

Src/AsyncAwaitBestPractices.MVVM/AsyncAwaitBestPractices.MVVM.csproj

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,14 @@
2828
- Mark internal classes as abstract
2929
- Update AssemblyFileVersion
3030
- Add NuGet README
31+
- Improve Nullablitiy
3132
</PackageReleaseNotes>
32-
<Version>6.0.3</Version>
33+
<Version>6.0.4</Version>
3334
<PackageReadmeFile>README.md</PackageReadmeFile>
3435
<RepositoryUrl>https://github.com/brminnick/AsyncAwaitBestPractices</RepositoryUrl>
3536
<Product>$(AssemblyName) ($(TargetFramework))</Product>
36-
<AssemblyVersion>6.0.3</AssemblyVersion>
37-
<AssemblyFileVersion>6.0.3</AssemblyFileVersion>
37+
<AssemblyVersion>6.0.4</AssemblyVersion>
38+
<AssemblyFileVersion>6.0.4</AssemblyFileVersion>
3839
<PackageVersion>$(Version)$(VersionSuffix)</PackageVersion>
3940
<Authors>Brandon Minnick, John Thiriet</Authors>
4041
<Owners>Brandon Minnick</Owners>

Src/AsyncAwaitBestPractices.MVVM/BaseCommand.shared.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public event EventHandler CanExecuteChanged
4545
/// </summary>
4646
/// <typeparam name="T"></typeparam>
4747
/// <returns></returns>
48-
protected static bool IsNullable<T>()
48+
private protected static bool IsNullable<T>()
4949
{
5050
var type = typeof(T);
5151

Src/AsyncAwaitBestPractices.UnitTests/WeakEventManagerTests/Tests_WeakEventManager_ActionT.cs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ class Tests_WeakEventManager_ActionT : BaseTest
77
{
88
readonly WeakEventManager<string> _actionEventManager = new();
99

10+
EventHandler<string>? _action;
11+
1012
event Action<string> ActionEvent
1113
{
1214
add => _actionEventManager.AddEventHandler(value);
@@ -223,4 +225,43 @@ public void WeakEventManagerActionT_RemoveEventHandler_WhiteSpaceEventName()
223225
//Assert
224226
Assert.Throws<ArgumentNullException>(() => _actionEventManager.RemoveEventHandler(s => { var temp = s; }, " "), "Value cannot be null.\nParameter name: eventName");
225227
}
228+
229+
#if NETCOREAPP3_1 || NET5_0 || NET6_0
230+
[Test]
231+
public void WeakEventManagerActionT_AddRemoveEventHandler_VerifyNotNullAttribute()
232+
{
233+
//Arrange
234+
EventHandler<string> addEventResult, removeEventResult;
235+
string actionName = nameof(_action);
236+
237+
//Act
238+
assignEvent();
239+
240+
_actionEventManager.AddEventHandler(_action, actionName);
241+
addEventResult = _action;
242+
243+
_action = null;
244+
assignEvent();
245+
246+
_actionEventManager.RemoveEventHandler(_action, actionName);
247+
removeEventResult = _action;
248+
249+
_action = null;
250+
251+
//Assert
252+
Assert.IsNull(_action);
253+
Assert.IsNotNull(addEventResult);
254+
Assert.IsNotNull(removeEventResult);
255+
256+
void assignEvent()
257+
{
258+
_action = new EventHandler<string>(handleEvent);
259+
260+
void handleEvent(object? sender, string e)
261+
{
262+
263+
}
264+
}
265+
}
266+
#endif
226267
}

Src/AsyncAwaitBestPractices.UnitTests/WeakEventManagerTests/Tests_WeakEventManager_Delegate.cs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ class Tests_WeakEventManager_Delegate : BaseTest, INotifyPropertyChanged
99
{
1010
readonly WeakEventManager _propertyChangedWeakEventManager = new();
1111

12+
PropertyChangedEventHandler? _nullablePropertyChangedEventHandler;
13+
1214
public event PropertyChangedEventHandler? PropertyChanged
1315
{
1416
add => _propertyChangedWeakEventManager.AddEventHandler(value);
@@ -304,4 +306,43 @@ static void sampleDelegate(object? sender, EventArgs e)
304306

305307
}
306308
}
309+
310+
#if NETCOREAPP3_1 || NET5_0 || NET6_0
311+
[Test]
312+
public void WeakEventManagerDelegate_AddRemoveEventHandler_VerifyNotNullAttribute()
313+
{
314+
//Arrange
315+
PropertyChangedEventHandler addEventHandlerResult, removeEventHandlerResult;
316+
string eventHandlerName = nameof(_nullablePropertyChangedEventHandler);
317+
318+
//Act
319+
assignEventHandler();
320+
321+
_propertyChangedWeakEventManager.AddEventHandler(_nullablePropertyChangedEventHandler, eventHandlerName);
322+
addEventHandlerResult = _nullablePropertyChangedEventHandler;
323+
324+
_nullablePropertyChangedEventHandler = null;
325+
assignEventHandler();
326+
327+
_propertyChangedWeakEventManager.RemoveEventHandler(_nullablePropertyChangedEventHandler, eventHandlerName);
328+
removeEventHandlerResult = _nullablePropertyChangedEventHandler;
329+
330+
_nullablePropertyChangedEventHandler = null;
331+
332+
//Assert
333+
Assert.IsNull(_nullablePropertyChangedEventHandler);
334+
Assert.IsNotNull(addEventHandlerResult);
335+
Assert.IsNotNull(removeEventHandlerResult);
336+
337+
void assignEventHandler()
338+
{
339+
_nullablePropertyChangedEventHandler = new PropertyChangedEventHandler(handlePropertyChanged);
340+
341+
void handlePropertyChanged(object? sender, PropertyChangedEventArgs e)
342+
{
343+
344+
}
345+
}
346+
}
347+
#endif
307348
}

Src/AsyncAwaitBestPractices/AsyncAwaitBestPractices.csproj

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,14 @@
3030
- Mark internal classes as abstract
3131
- Update AssemblyFileVersion
3232
- Add NuGet README
33+
- Improve Nullablitiy
3334
</PackageReleaseNotes>
34-
<Version>6.0.3</Version>
35+
<Version>6.0.4</Version>
3536
<PackageReadmeFile>README.md</PackageReadmeFile>
3637
<RepositoryUrl>https://github.com/brminnick/AsyncAwaitBestPractices</RepositoryUrl>
3738
<Product>$(AssemblyName) ($(TargetFramework))</Product>
38-
<AssemblyVersion>6.0.3</AssemblyVersion>
39-
<AssemblyFileVersion>6.0.3</AssemblyFileVersion>
39+
<AssemblyVersion>6.0.4</AssemblyVersion>
40+
<AssemblyFileVersion>6.0.4</AssemblyFileVersion>
4041
<PackageVersion>$(Version)$(VersionSuffix)</PackageVersion>
4142
<Authors>Brandon Minnick, John Thiriet</Authors>
4243
<Owners>Brandon Minnick</Owners>

Src/AsyncAwaitBestPractices/WeakEventManager/WeakEventManager.extensions.shared.cs

Lines changed: 51 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
using System;
22
using System.Runtime.CompilerServices;
3+
#if NETSTANDARD2_1
4+
using System.Diagnostics.CodeAnalysis;
5+
#endif
36

47
namespace AsyncAwaitBestPractices;
58

@@ -10,28 +13,56 @@ public partial class WeakEventManager<TEventArgs>
1013
/// </summary>
1114
/// <param name="handler">Handler</param>
1215
/// <param name="eventName">Event name</param>
13-
public void AddEventHandler(EventHandler<TEventArgs>? handler, [CallerMemberName] string eventName = "") => AddEventHandler(in handler, in eventName);
16+
#if NETSTANDARD2_1
17+
public void AddEventHandler([NotNull] EventHandler<TEventArgs>? handler, [CallerMemberName, NotNull] string eventName = "")
18+
#else
19+
public void AddEventHandler(EventHandler<TEventArgs>? handler, [CallerMemberName] string eventName = "")
20+
#endif
21+
{
22+
AddEventHandler(in handler, in eventName);
23+
}
1424

1525
/// <summary>
1626
/// Adds the event handler
1727
/// </summary>
1828
/// <param name="action">Handler</param>
1929
/// <param name="eventName">Event name</param>
20-
public void AddEventHandler(Action<TEventArgs>? action, [CallerMemberName] string eventName = "") => AddEventHandler(in action, in eventName);
30+
#if NETSTANDARD2_1
31+
public void AddEventHandler([NotNull] Action<TEventArgs>? action, [CallerMemberName, NotNull] string eventName = "")
32+
#else
33+
public void AddEventHandler(Action<TEventArgs>? action, [CallerMemberName] string eventName = "")
34+
#endif
35+
{
36+
AddEventHandler(in action, in eventName);
37+
}
2138

2239
/// <summary>
2340
/// Removes the event handler
2441
/// </summary>
2542
/// <param name="handler">Handler</param>
2643
/// <param name="eventName">Event name</param>
27-
public void RemoveEventHandler(EventHandler<TEventArgs>? handler, [CallerMemberName] string eventName = "") => RemoveEventHandler(in handler, in eventName);
44+
#if NETSTANDARD2_1
45+
public void RemoveEventHandler([NotNull] EventHandler<TEventArgs>? handler, [CallerMemberName, NotNull] string eventName = "")
46+
#else
47+
public void RemoveEventHandler(EventHandler<TEventArgs>? handler, [CallerMemberName] string eventName = "")
48+
#endif
49+
{
50+
RemoveEventHandler(in handler, in eventName);
51+
}
2852

2953
/// <summary>
3054
/// Removes the event handler
3155
/// </summary>
3256
/// <param name="action">Handler</param>
3357
/// <param name="eventName">Event name</param>
34-
public void RemoveEventHandler(Action<TEventArgs>? action, [CallerMemberName] string eventName = "") => RemoveEventHandler(in action, in eventName);
58+
#if NETSTANDARD2_1
59+
public void RemoveEventHandler([NotNull] Action<TEventArgs>? action, [CallerMemberName, NotNull] string eventName = "")
60+
#else
61+
public void RemoveEventHandler(Action<TEventArgs>? action, [CallerMemberName] string eventName = "")
62+
#endif
63+
{
64+
RemoveEventHandler(in action, in eventName);
65+
}
3566

3667
/// <summary>
3768
/// Invokes the event EventHandler
@@ -59,14 +90,28 @@ public partial class WeakEventManager
5990
/// </summary>
6091
/// <param name="handler">Handler</param>
6192
/// <param name="eventName">Event name</param>
62-
public void AddEventHandler(Delegate? handler, [CallerMemberName] string eventName = "") => AddEventHandler(in handler, in eventName);
93+
#if NETSTANDARD2_1
94+
public void AddEventHandler([NotNull] Delegate? handler, [CallerMemberName, NotNull] string eventName = "")
95+
#else
96+
public void AddEventHandler(Delegate? handler, [CallerMemberName] string eventName = "")
97+
#endif
98+
{
99+
AddEventHandler(in handler, in eventName);
100+
}
63101

64102
/// <summary>
65103
/// Removes the event handler.
66104
/// </summary>
67105
/// <param name="handler">Handler</param>
68106
/// <param name="eventName">Event name</param>
69-
public void RemoveEventHandler(Delegate? handler, [CallerMemberName] string eventName = "") => RemoveEventHandler(in handler, in eventName);
107+
#if NETSTANDARD2_1
108+
public void RemoveEventHandler([NotNull] Delegate? handler, [CallerMemberName, NotNull] string eventName = "")
109+
#else
110+
public void RemoveEventHandler(Delegate? handler, [CallerMemberName] string eventName = "")
111+
#endif
112+
{
113+
RemoveEventHandler(in handler, in eventName);
114+
}
70115

71116
/// <summary>
72117
/// Invokes the event EventHandler

Src/AsyncAwaitBestPractices/WeakEventManager/WeakEventManager.shared.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
using System.Collections.Generic;
33
using System.Reflection;
44
using System.Runtime.CompilerServices;
5+
#if NETSTANDARD2_1
6+
using System.Diagnostics.CodeAnalysis;
7+
#endif
58

69
using static System.String;
710

@@ -20,7 +23,11 @@ public partial class WeakEventManager<TEventArgs>
2023
/// </summary>
2124
/// <param name="handler">Handler</param>
2225
/// <param name="eventName">Event name</param>
26+
#if NETSTANDARD2_1
27+
public void AddEventHandler([NotNull] in EventHandler<TEventArgs>? handler, [CallerMemberName, NotNull] in string eventName = "")
28+
#else
2329
public void AddEventHandler(in EventHandler<TEventArgs>? handler, [CallerMemberName] in string eventName = "")
30+
#endif
2431
{
2532
if (IsNullOrWhiteSpace(eventName))
2633
throw new ArgumentNullException(nameof(eventName));
@@ -36,7 +43,11 @@ public void AddEventHandler(in EventHandler<TEventArgs>? handler, [CallerMemberN
3643
/// </summary>
3744
/// <param name="action">Handler</param>
3845
/// <param name="eventName">Event name</param>
46+
#if NETSTANDARD2_1
47+
public void AddEventHandler([NotNull] in Action<TEventArgs>? action, [CallerMemberName, NotNull] in string eventName = "")
48+
#else
3949
public void AddEventHandler(in Action<TEventArgs>? action, [CallerMemberName] in string eventName = "")
50+
#endif
4051
{
4152
if (IsNullOrWhiteSpace(eventName))
4253
throw new ArgumentNullException(nameof(eventName));
@@ -52,7 +63,11 @@ public void AddEventHandler(in Action<TEventArgs>? action, [CallerMemberName] in
5263
/// </summary>
5364
/// <param name="handler">Handler</param>
5465
/// <param name="eventName">Event name</param>
66+
#if NETSTANDARD2_1
67+
public void RemoveEventHandler([NotNull] in EventHandler<TEventArgs>? handler, [CallerMemberName, NotNull] in string eventName = "")
68+
#else
5569
public void RemoveEventHandler(in EventHandler<TEventArgs>? handler, [CallerMemberName] in string eventName = "")
70+
#endif
5671
{
5772
if (IsNullOrWhiteSpace(eventName))
5873
throw new ArgumentNullException(nameof(eventName));
@@ -68,7 +83,11 @@ public void RemoveEventHandler(in EventHandler<TEventArgs>? handler, [CallerMemb
6883
/// </summary>
6984
/// <param name="action">Handler</param>
7085
/// <param name="eventName">Event name</param>
86+
#if NETSTANDARD2_1
87+
public void RemoveEventHandler([NotNull] in Action<TEventArgs>? action, [CallerMemberName, NotNull] in string eventName = "")
88+
#else
7189
public void RemoveEventHandler(in Action<TEventArgs>? action, [CallerMemberName] in string eventName = "")
90+
#endif
7291
{
7392
if (IsNullOrWhiteSpace(eventName))
7493
throw new ArgumentNullException(nameof(eventName));
@@ -109,7 +128,11 @@ public partial class WeakEventManager
109128
/// </summary>
110129
/// <param name="handler">Handler</param>
111130
/// <param name="eventName">Event name</param>
131+
#if NETSTANDARD2_1
132+
public void AddEventHandler([NotNull] in Delegate? handler, [CallerMemberName, NotNull] in string eventName = "")
133+
#else
112134
public void AddEventHandler(in Delegate? handler, [CallerMemberName] in string eventName = "")
135+
#endif
113136
{
114137
if (IsNullOrWhiteSpace(eventName))
115138
throw new ArgumentNullException(nameof(eventName));
@@ -125,7 +148,11 @@ public void AddEventHandler(in Delegate? handler, [CallerMemberName] in string e
125148
/// </summary>
126149
/// <param name="handler">Handler</param>
127150
/// <param name="eventName">Event name</param>
151+
#if NETSTANDARD2_1
152+
public void RemoveEventHandler([NotNull] in Delegate? handler, [CallerMemberName, NotNull] in string eventName = "")
153+
#else
128154
public void RemoveEventHandler(in Delegate? handler, [CallerMemberName] in string eventName = "")
155+
#endif
129156
{
130157
if (IsNullOrWhiteSpace(eventName))
131158
throw new ArgumentNullException(nameof(eventName));

0 commit comments

Comments
 (0)