GetUserProperty extension.release/3.x.x
@@ -22,6 +22,7 @@ | |||||
* [Server] Added interceptor for unsubscriptions. | * [Server] Added interceptor for unsubscriptions. | ||||
* [MQTTnet.Server] Added interceptor for unsubscriptions. | * [MQTTnet.Server] Added interceptor for unsubscriptions. | ||||
* [MQTTnet.AspNetCore] improved compatibility with AspNetCore 3.1 | * [MQTTnet.AspNetCore] improved compatibility with AspNetCore 3.1 | ||||
* [Core] Added MqttApplicationMessage.GetUserProperty() convenience method (thanks to @PMExtra). | |||||
* [Client] Support WithConnectionUri to configure client (thanks to @PMExtra). | * [Client] Support WithConnectionUri to configure client (thanks to @PMExtra). | ||||
* [Server] Removed exceptions when user properties are set with MQTT protocol version 3.1 | * [Server] Removed exceptions when user properties are set with MQTT protocol version 3.1 | ||||
</releaseNotes> | </releaseNotes> | ||||
@@ -0,0 +1,32 @@ | |||||
using System; | |||||
using System.ComponentModel; | |||||
using System.Linq; | |||||
namespace MQTTnet.Extensions | |||||
{ | |||||
public static class UserPropertyExtension | |||||
{ | |||||
public static string GetUserProperty(this MqttApplicationMessage message, string propertyName, StringComparison comparisonType = StringComparison.OrdinalIgnoreCase) | |||||
{ | |||||
if (message == null) throw new ArgumentNullException(nameof(message)); | |||||
if (propertyName == null) throw new ArgumentNullException(nameof(propertyName)); | |||||
return message.UserProperties?.SingleOrDefault(up => up.Name.Equals(propertyName, comparisonType))?.Value; | |||||
} | |||||
public static T GetUserProperty<T>(this MqttApplicationMessage message, string propertyName, StringComparison comparisonType = StringComparison.OrdinalIgnoreCase) | |||||
{ | |||||
var value = GetUserProperty(message, propertyName, comparisonType); | |||||
var typeDescriptor = TypeDescriptor.GetConverter(typeof(T)); | |||||
try | |||||
{ | |||||
return (T) typeDescriptor.ConvertFromString(value); | |||||
} | |||||
catch (Exception ex) | |||||
{ | |||||
throw new InvalidOperationException($"Cannot convert value({value ?? "null"}) of UserProperty({propertyName}) to {typeof(T).FullName}.", ex); | |||||
} | |||||
} | |||||
} | |||||
} |
@@ -42,6 +42,7 @@ | |||||
</PropertyGroup> | </PropertyGroup> | ||||
<ItemGroup Condition="'$(TargetFramework)'=='netstandard1.3'"> | <ItemGroup Condition="'$(TargetFramework)'=='netstandard1.3'"> | ||||
<PackageReference Include="System.ComponentModel.TypeConverter" Version="4.3.0" /> | |||||
<PackageReference Include="System.Net.Security" Version="4.3.2" /> | <PackageReference Include="System.Net.Security" Version="4.3.2" /> | ||||
<PackageReference Include="System.Net.WebSockets" Version="4.3.0" /> | <PackageReference Include="System.Net.WebSockets" Version="4.3.0" /> | ||||
<PackageReference Include="System.Net.WebSockets.Client" Version="4.3.2" /> | <PackageReference Include="System.Net.WebSockets.Client" Version="4.3.2" /> | ||||
@@ -0,0 +1,33 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using Microsoft.VisualStudio.TestTools.UnitTesting; | |||||
using MQTTnet.Extensions; | |||||
using MQTTnet.Packets; | |||||
namespace MQTTnet.Tests | |||||
{ | |||||
[TestClass] | |||||
public class MqttApplicationMessage_Tests | |||||
{ | |||||
[TestMethod] | |||||
public void GetUserProperty_Test() | |||||
{ | |||||
var message = new MqttApplicationMessage | |||||
{ | |||||
UserProperties = new List<MqttUserProperty> | |||||
{ | |||||
new MqttUserProperty("foo", "bar"), | |||||
new MqttUserProperty("value", "1011"), | |||||
new MqttUserProperty("CASE", "insensitive") | |||||
} | |||||
}; | |||||
Assert.AreEqual("bar", message.GetUserProperty("foo")); | |||||
Assert.AreEqual(1011, message.GetUserProperty<int>("value")); | |||||
Assert.AreEqual("insensitive", message.GetUserProperty("case")); | |||||
Assert.AreEqual(null, message.GetUserProperty("nonExists")); | |||||
Assert.AreEqual(null, message.GetUserProperty<int?>("nonExists")); | |||||
Assert.ThrowsException<InvalidOperationException>(() => message.GetUserProperty<int>("nonExists")); | |||||
} | |||||
} | |||||
} |