/// <summary> /// Gets metadata as optional value. /// </summary> /// <typeparam name="TMetadata">Metadata type.</typeparam> /// <param name="metadataProvider">Metadata provider.</param> /// <param name="metadataName">Optional metadata name.</param> /// <returns>Metadata or default value if not found.</returns> public static Option <TMetadata> GetMetadataAsOption <TMetadata>( this IMetadataProvider metadataProvider, string metadataName = null) { metadataProvider.AssertArgumentNotNull(nameof(metadataProvider)); metadataName ??= typeof(TMetadata).FullName; var metadata = metadataProvider.Metadata ?? metadataProvider.GetInstanceMetadata(); var propertyValue = metadata.GetPropertyValue <TMetadata>(Search .ByNameAndComparer <TMetadata>(metadataName, MetadataProvider.DefaulPropertyComparer) .ReturnNull()); if (propertyValue.HasValue() && !propertyValue.Value.IsNull()) { return(propertyValue.Value); } return(Option <TMetadata> .None); }