diff --git a/README.md b/README.md
index f504211c..33cf5c5d 100644
--- a/README.md
+++ b/README.md
@@ -167,6 +167,31 @@ client.AddHooks(new ExampleClientHook());
var value = await client.GetBooleanValue("boolFlag", false, context, new FlagEvaluationOptions(new ExampleInvocationHook()));
```
+### Logging
+
+The .NET SDK uses Microsoft.Extensions.Logging. See the [manual](https://learn.microsoft.com/en-us/dotnet/core/extensions/logging?tabs=command-line) for complete documentation.
+
+### Named clients
+
+Clients can be given a name.
+A name is a logical identifier that can be used to associate clients with a particular provider.
+If a name has no associated provider, the global provider is used.
+
+```csharp
+// registering the default provider
+await Api.Instance.SetProvider(new LocalProvider());
+
+// registering a named provider
+await Api.Instance.SetProvider("clientForCache", new CachedProvider());
+
+// a client backed by default provider
+FeatureClient clientDefault = Api.Instance.GetClient();
+
+// a client backed by CachedProvider
+FeatureClient clientNamed = Api.Instance.GetClient("clientForCache");
+
+```
+
### Eventing
Events allow you to react to state changes in the provider or underlying flag management system, such as flag definition changes,
@@ -204,35 +229,6 @@ await Api.Instance.SetProvider(myClient.GetMetadata().Name, provider);
myClient.AddHandler(ProviderEventTypes.ProviderReady, callback);
```
-### Logging
-
-The .NET SDK uses Microsoft.Extensions.Logging. See the [manual](https://learn.microsoft.com/en-us/dotnet/core/extensions/logging?tabs=command-line) for complete documentation.
-
-### Named clients
-
-Clients can be given a name.
-A name is a logical identifier that can be used to associate clients with a particular provider.
-If a name has no associated provider, the global provider is used.
-
-```csharp
-// registering the default provider
-await Api.Instance.SetProvider(new LocalProvider());
-
-// registering a named provider
-await Api.Instance.SetProvider("clientForCache", new CachedProvider());
-
-// a client backed by default provider
-FeatureClient clientDefault = Api.Instance.GetClient();
-
-// a client backed by CachedProvider
-FeatureClient clientNamed = Api.Instance.GetClient("clientForCache");
-
-```
-
-### Eventing
-
-Events are currently not supported by the .NET SDK. Progress on this feature can be tracked [here](https://github.com/open-feature/dotnet-sdk/issues/126).
-
### Shutdown
The OpenFeature API provides a close function to perform a cleanup of all registered providers. This should only be called when your application is in the process of shutting down.
diff --git a/src/OpenFeature/Api.cs b/src/OpenFeature/Api.cs
index 8d0e22f5..440242da 100644
--- a/src/OpenFeature/Api.cs
+++ b/src/OpenFeature/Api.cs
@@ -127,7 +127,26 @@ public FeatureClient GetClient(string name = null, string version = null, ILogge
///
///
/// A list of
- public void AddHooks(IEnumerable hooks) => this._hooks.PushRange(hooks.ToArray());
+ public void AddHooks(IEnumerable hooks)
+#if NET7_0_OR_GREATER
+ => this._hooks.PushRange(hooks as Hook[] ?? hooks.ToArray());
+#else
+ {
+ // See: https://github.com/dotnet/runtime/issues/62121
+ if (hooks is Hook[] array)
+ {
+ if (array.Length > 0)
+ this._hooks.PushRange(array);
+
+ return;
+ }
+
+ array = hooks.ToArray();
+
+ if (array.Length > 0)
+ this._hooks.PushRange(array);
+ }
+#endif
///
/// Adds a hook to global hooks list
diff --git a/src/OpenFeature/FeatureProvider.cs b/src/OpenFeature/FeatureProvider.cs
index 3dd85102..000ab0fb 100644
--- a/src/OpenFeature/FeatureProvider.cs
+++ b/src/OpenFeature/FeatureProvider.cs
@@ -29,7 +29,7 @@ public abstract class FeatureProvider
///
/// The event channel of the provider.
///
- protected Channel