Merge pull request #16693 from abpframework/liangshiwei/group1nullable

Enable nullable annotations for Volo.Abp.Core
pull/16722/head
Halil İbrahim Kalkan 2 years ago committed by GitHub
commit b034c61793
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -8,13 +8,13 @@ public class AbpConfigurationBuilderOptions
/// Used to set assembly which is used to get the user secret id for the application.
/// Use this or <see cref="UserSecretsId"/> (higher priority)
/// </summary>
public Assembly UserSecretsAssembly { get; set; }
public Assembly? UserSecretsAssembly { get; set; }
/// <summary>
/// Used to set user secret id for the application.
/// Use this (higher priority) or <see cref="UserSecretsAssembly"/>
/// </summary>
public string UserSecretsId { get; set; }
public string? UserSecretsId { get; set; }
/// <summary>
/// Default value: "appsettings".
@ -34,20 +34,20 @@ public class AbpConfigurationBuilderOptions
/// <summary>
/// Environment name. Generally used "Development", "Staging" or "Production".
/// </summary>
public string EnvironmentName { get; set; }
public string? EnvironmentName { get; set; }
/// <summary>
/// Base path to read the configuration file indicated by <see cref="FileName"/>.
/// </summary>
public string BasePath { get; set; }
public string? BasePath { get; set; }
/// <summary>
/// Prefix for the environment variables.
/// </summary>
public string EnvironmentVariablesPrefix { get; set; }
public string? EnvironmentVariablesPrefix { get; set; }
/// <summary>
/// Command line arguments.
/// </summary>
public string[] CommandLineArgs { get; set; }
public string[]? CommandLineArgs { get; set; }
}

@ -6,8 +6,8 @@ namespace Microsoft.Extensions.Configuration;
public static class ConfigurationHelper
{
public static IConfigurationRoot BuildConfiguration(
AbpConfigurationBuilderOptions options = null,
Action<IConfigurationBuilder> builderAction = null)
AbpConfigurationBuilderOptions? options = null,
Action<IConfigurationBuilder>? builderAction = null)
{
options ??= new AbpConfigurationBuilderOptions();
@ -17,7 +17,7 @@ public static class ConfigurationHelper
}
var builder = new ConfigurationBuilder()
.SetBasePath(options.BasePath)
.SetBasePath(options.BasePath!)
.AddJsonFile(options.FileName + ".json", optional: options.Optional, reloadOnChange: options.ReloadOnChange);
if (!options.EnvironmentName.IsNullOrEmpty())

@ -10,7 +10,7 @@ public static class ServiceCollectionApplicationExtensions
{
public static IAbpApplicationWithExternalServiceProvider AddApplication<TStartupModule>(
[NotNull] this IServiceCollection services,
[CanBeNull] Action<AbpApplicationCreationOptions> optionsAction = null)
Action<AbpApplicationCreationOptions>? optionsAction = null)
where TStartupModule : IAbpModule
{
return AbpApplicationFactory.Create<TStartupModule>(services, optionsAction);
@ -19,14 +19,14 @@ public static class ServiceCollectionApplicationExtensions
public static IAbpApplicationWithExternalServiceProvider AddApplication(
[NotNull] this IServiceCollection services,
[NotNull] Type startupModuleType,
[CanBeNull] Action<AbpApplicationCreationOptions> optionsAction = null)
Action<AbpApplicationCreationOptions>? optionsAction = null)
{
return AbpApplicationFactory.Create(startupModuleType, services, optionsAction);
}
public async static Task<IAbpApplicationWithExternalServiceProvider> AddApplicationAsync<TStartupModule>(
[NotNull] this IServiceCollection services,
[CanBeNull] Action<AbpApplicationCreationOptions> optionsAction = null)
Action<AbpApplicationCreationOptions>? optionsAction = null)
where TStartupModule : IAbpModule
{
return await AbpApplicationFactory.CreateAsync<TStartupModule>(services, optionsAction);
@ -35,13 +35,12 @@ public static class ServiceCollectionApplicationExtensions
public async static Task<IAbpApplicationWithExternalServiceProvider> AddApplicationAsync(
[NotNull] this IServiceCollection services,
[NotNull] Type startupModuleType,
[CanBeNull] Action<AbpApplicationCreationOptions> optionsAction = null)
Action<AbpApplicationCreationOptions>? optionsAction = null)
{
return await AbpApplicationFactory.CreateAsync(startupModuleType, services, optionsAction);
}
[CanBeNull]
public static string GetApplicationName(this IServiceCollection services)
public static string? GetApplicationName(this IServiceCollection services)
{
return services.GetSingletonInstance<IApplicationInfoAccessor>().ApplicationName;
}

@ -24,9 +24,9 @@ public static class ServiceCollectionCommonExtensions
return services.GetSingletonInstance<ITypeFinder>();
}
public static T GetSingletonInstanceOrNull<T>(this IServiceCollection services)
public static T? GetSingletonInstanceOrNull<T>(this IServiceCollection services)
{
return (T)services
return (T?)services
.FirstOrDefault(d => d.ServiceType == typeof(T))
?.ImplementationInstance;
}
@ -65,13 +65,13 @@ public static class ServiceCollectionCommonExtensions
.GetMethods()
.Single(m => m.Name == nameof(BuildServiceProviderFromFactory) && m.IsGenericMethod)
.MakeGenericMethod(containerBuilderType)
.Invoke(null, new object[] { services, null });
.Invoke(null, new object?[] { services, null })!;
}
return services.BuildServiceProvider();
}
public static IServiceProvider BuildServiceProviderFromFactory<TContainerBuilder>([NotNull] this IServiceCollection services, Action<TContainerBuilder> builderAction = null)
public static IServiceProvider BuildServiceProviderFromFactory<TContainerBuilder>([NotNull] this IServiceCollection services, Action<TContainerBuilder>? builderAction = null) where TContainerBuilder : notnull
{
Check.NotNull(services, nameof(services));
@ -90,7 +90,7 @@ public static class ServiceCollectionCommonExtensions
/// Resolves a dependency using given <see cref="IServiceCollection"/>.
/// This method should be used only after dependency injection registration phase completed.
/// </summary>
internal static T GetService<T>(this IServiceCollection services)
internal static T? GetService<T>(this IServiceCollection services)
{
return services
.GetSingletonInstance<IAbpApplication>()
@ -102,7 +102,7 @@ public static class ServiceCollectionCommonExtensions
/// Resolves a dependency using given <see cref="IServiceCollection"/>.
/// This method should be used only after dependency injection registration phase completed.
/// </summary>
internal static object GetService(this IServiceCollection services, Type type)
internal static object? GetService(this IServiceCollection services, Type type)
{
return services
.GetSingletonInstance<IAbpApplication>()
@ -115,7 +115,7 @@ public static class ServiceCollectionCommonExtensions
/// Throws exception if service is not registered.
/// This method should be used only after dependency injection registration phase completed.
/// </summary>
public static T GetRequiredService<T>(this IServiceCollection services)
public static T GetRequiredService<T>(this IServiceCollection services) where T : notnull
{
return services
.GetSingletonInstance<IAbpApplication>()
@ -140,25 +140,25 @@ public static class ServiceCollectionCommonExtensions
/// Returns a <see cref="Lazy{T}"/> to resolve a service from given <see cref="IServiceCollection"/>
/// once dependency injection registration phase completed.
/// </summary>
public static Lazy<T> GetServiceLazy<T>(this IServiceCollection services)
public static Lazy<T?> GetServiceLazy<T>(this IServiceCollection services)
{
return new Lazy<T>(services.GetService<T>, true);
return new Lazy<T?>(services.GetService<T>, true);
}
/// <summary>
/// Returns a <see cref="Lazy{T}"/> to resolve a service from given <see cref="IServiceCollection"/>
/// once dependency injection registration phase completed.
/// </summary>
public static Lazy<object> GetServiceLazy(this IServiceCollection services, Type type)
public static Lazy<object?> GetServiceLazy(this IServiceCollection services, Type type)
{
return new Lazy<object>(() => services.GetService(type), true);
return new Lazy<object?>(() => services.GetService(type), true);
}
/// <summary>
/// Returns a <see cref="Lazy{T}"/> to resolve a service from given <see cref="IServiceCollection"/>
/// once dependency injection registration phase completed.
/// </summary>
public static Lazy<T> GetRequiredServiceLazy<T>(this IServiceCollection services)
public static Lazy<T> GetRequiredServiceLazy<T>(this IServiceCollection services) where T : notnull
{
return new Lazy<T>(services.GetRequiredService<T>, true);
}
@ -172,7 +172,7 @@ public static class ServiceCollectionCommonExtensions
return new Lazy<object>(() => services.GetRequiredService(type), true);
}
public static IServiceProvider GetServiceProviderOrNull(this IServiceCollection services)
public static IServiceProvider? GetServiceProviderOrNull(this IServiceCollection services)
{
return services.GetObjectOrNull<IServiceProvider>();
}

@ -21,7 +21,7 @@ public static class ServiceCollectionConfigurationExtensions
}
[CanBeNull]
public static IConfiguration GetConfigurationOrNull(this IServiceCollection services)
public static IConfiguration? GetConfigurationOrNull(this IServiceCollection services)
{
var hostBuilderContext = services.GetSingletonInstanceOrNull<HostBuilderContext>();
if (hostBuilderContext?.Configuration != null)

@ -40,7 +40,7 @@ public static class ServiceCollectionObjectAccessorExtensions
return accessor;
}
public static T GetObjectOrNull<T>(this IServiceCollection services)
public static T? GetObjectOrNull<T>(this IServiceCollection services)
where T : class
{
return services.GetSingletonInstanceOrNull<IObjectAccessor<T>>()?.Value;

@ -83,7 +83,7 @@ public static class AbpLoggerExtensions
private static void LogData(ILogger logger, Exception exception, LogLevel logLevel)
{
if (exception.Data == null || exception.Data.Count <= 0)
if (exception.Data.Count <= 0)
{
return;
}
@ -102,23 +102,22 @@ public static class AbpLoggerExtensions
{
var loggingExceptions = new List<IExceptionWithSelfLogging>();
if (exception is IExceptionWithSelfLogging)
if (exception is IExceptionWithSelfLogging logging)
{
loggingExceptions.Add(exception as IExceptionWithSelfLogging);
loggingExceptions.Add(logging);
}
else if (exception is AggregateException && exception.InnerException != null)
else if (exception is AggregateException aggException && aggException.InnerException != null)
{
var aggException = exception as AggregateException;
if (aggException.InnerException is IExceptionWithSelfLogging)
if (aggException.InnerException is IExceptionWithSelfLogging selfLogging)
{
loggingExceptions.Add(aggException.InnerException as IExceptionWithSelfLogging);
loggingExceptions.Add(selfLogging);
}
foreach (var innerException in aggException.InnerExceptions)
{
if (innerException is IExceptionWithSelfLogging)
if (innerException is IExceptionWithSelfLogging withSelfLogging)
{
loggingExceptions.AddIfNotContains(innerException as IExceptionWithSelfLogging);
loggingExceptions.AddIfNotContains(withSelfLogging);
}
}
}

@ -36,7 +36,7 @@ public static class AbpObjectExtensions
{
if (typeof(T) == typeof(Guid))
{
return (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFromInvariantString(obj.ToString());
return (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFromInvariantString(obj.ToString()!)!;
}
return (T)Convert.ChangeType(obj, typeof(T), CultureInfo.InvariantCulture);

@ -47,7 +47,7 @@ public static class AbpStringExtensions
/// Indicates whether this string is null or an System.String.Empty string.
/// </summary>
[ContractAnnotation("str:null => true")]
public static bool IsNullOrEmpty(this string str)
public static bool IsNullOrEmpty(this string? str)
{
return string.IsNullOrEmpty(str);
}
@ -56,7 +56,7 @@ public static class AbpStringExtensions
/// indicates whether this string is null, empty, or consists only of white-space characters.
/// </summary>
[ContractAnnotation("str:null => true")]
public static bool IsNullOrWhiteSpace(this string str)
public static bool IsNullOrWhiteSpace(this string? str)
{
return string.IsNullOrWhiteSpace(str);
}
@ -482,7 +482,7 @@ public static class AbpStringExtensions
/// Gets a substring of a string from beginning of the string if it exceeds maximum length.
/// </summary>
[ContractAnnotation("null <= str:null")]
public static string Truncate(this string str, int maxLength)
public static string? Truncate(this string? str, int maxLength)
{
if (str == null)
{
@ -501,7 +501,7 @@ public static class AbpStringExtensions
/// Gets a substring of a string from Ending of the string if it exceeds maximum length.
/// </summary>
[ContractAnnotation("null <= str:null")]
public static string TruncateFromBeginning(this string str, int maxLength)
public static string? TruncateFromBeginning(this string? str, int maxLength)
{
if (str == null)
{
@ -522,7 +522,7 @@ public static class AbpStringExtensions
/// Returning string can not be longer than maxLength.
/// </summary>
/// <exception cref="ArgumentNullException">Thrown if <paramref name="str"/> is null</exception>
public static string TruncateWithPostfix(this string str, int maxLength)
public static string? TruncateWithPostfix(this string? str, int maxLength)
{
return TruncateWithPostfix(str, maxLength, "...");
}
@ -534,7 +534,7 @@ public static class AbpStringExtensions
/// </summary>
/// <exception cref="ArgumentNullException">Thrown if <paramref name="str"/> is null</exception>
[ContractAnnotation("null <= str:null")]
public static string TruncateWithPostfix(this string str, int maxLength, string postfix)
public static string? TruncateWithPostfix(this string? str, int maxLength, string postfix)
{
if (str == null)
{

@ -72,9 +72,9 @@ public static class AbpTypeExtensions
private static void AddTypeAndBaseTypesRecursively(
[NotNull] List<Type> types,
[CanBeNull] Type type,
Type? type,
bool includeObject,
[CanBeNull] Type stoppingType = null)
Type? stoppingType = null)
{
if (type == null || type == stoppingType)
{

@ -13,7 +13,7 @@ public static class AbpCollectionExtensions
/// Checks whatever given collection object is null or has no item.
/// </summary>
[ContractAnnotation("source:null => true")]
public static bool IsNullOrEmpty<T>([CanBeNull] this ICollection<T> source)
public static bool IsNullOrEmpty<T>(this ICollection<T>? source)
{
return source == null || source.Count <= 0;
}

@ -16,9 +16,9 @@ public static class AbpDictionaryExtensions
/// <param name="key">Key</param>
/// <param name="value">Value of the key (or default value if key not exists)</param>
/// <returns>True if key does exists in the dictionary</returns>
internal static bool TryGetValue<T>(this IDictionary<string, object> dictionary, string key, out T value)
internal static bool TryGetValue<T>(this IDictionary<string, object> dictionary, string key, out T? value)
{
object valueObj;
object? valueObj;
if (dictionary.TryGetValue(key, out valueObj) && valueObj is T)
{
value = (T)valueObj;
@ -37,9 +37,9 @@ public static class AbpDictionaryExtensions
/// <typeparam name="TKey">Type of the key</typeparam>
/// <typeparam name="TValue">Type of the value</typeparam>
/// <returns>Value if found, default if can not found.</returns>
public static TValue GetOrDefault<TKey, TValue>(this Dictionary<TKey, TValue> dictionary, TKey key)
public static TValue? GetOrDefault<TKey, TValue>(this Dictionary<TKey, TValue> dictionary, TKey key) where TKey : notnull
{
TValue obj;
TValue? obj;
return dictionary.TryGetValue(key, out obj) ? obj : default;
}
@ -51,7 +51,7 @@ public static class AbpDictionaryExtensions
/// <typeparam name="TKey">Type of the key</typeparam>
/// <typeparam name="TValue">Type of the value</typeparam>
/// <returns>Value if found, default if can not found.</returns>
public static TValue GetOrDefault<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key)
public static TValue? GetOrDefault<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key)
{
return dictionary.TryGetValue(key, out var obj) ? obj : default;
}
@ -64,7 +64,7 @@ public static class AbpDictionaryExtensions
/// <typeparam name="TKey">Type of the key</typeparam>
/// <typeparam name="TValue">Type of the value</typeparam>
/// <returns>Value if found, default if can not found.</returns>
public static TValue GetOrDefault<TKey, TValue>(this IReadOnlyDictionary<TKey, TValue> dictionary, TKey key)
public static TValue? GetOrDefault<TKey, TValue>(this IReadOnlyDictionary<TKey, TValue> dictionary, TKey key)
{
return dictionary.TryGetValue(key, out var obj) ? obj : default;
}
@ -77,7 +77,7 @@ public static class AbpDictionaryExtensions
/// <typeparam name="TKey">Type of the key</typeparam>
/// <typeparam name="TValue">Type of the value</typeparam>
/// <returns>Value if found, default if can not found.</returns>
public static TValue GetOrDefault<TKey, TValue>(this ConcurrentDictionary<TKey, TValue> dictionary, TKey key)
public static TValue? GetOrDefault<TKey, TValue>(this ConcurrentDictionary<TKey, TValue> dictionary, TKey key) where TKey : notnull
{
return dictionary.TryGetValue(key, out var obj) ? obj : default;
}
@ -93,7 +93,7 @@ public static class AbpDictionaryExtensions
/// <returns>Value if found, default if can not found.</returns>
public static TValue GetOrAdd<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key, Func<TKey, TValue> factory)
{
TValue obj;
TValue? obj;
if (dictionary.TryGetValue(key, out obj))
{
return obj;
@ -125,7 +125,7 @@ public static class AbpDictionaryExtensions
/// <typeparam name="TKey">Type of the key</typeparam>
/// <typeparam name="TValue">Type of the value</typeparam>
/// <returns>Value if found, default if can not found.</returns>
public static TValue GetOrAdd<TKey, TValue>(this ConcurrentDictionary<TKey, TValue> dictionary, TKey key, Func<TValue> factory)
public static TValue GetOrAdd<TKey, TValue>(this ConcurrentDictionary<TKey, TValue> dictionary, TKey key, Func<TValue> factory) where TKey : notnull
{
return dictionary.GetOrAdd(key, k => factory());
}
@ -138,7 +138,7 @@ public static class AbpDictionaryExtensions
public static dynamic ConvertToDynamicObject(this Dictionary<string, object> dictionary)
{
var expandoObject = new ExpandoObject();
var expendObjectCollection = (ICollection<KeyValuePair<string, object>>)expandoObject;
var expendObjectCollection = (ICollection<KeyValuePair<string, object>>)expandoObject!;
foreach (var keyValuePair in dictionary)
{

@ -196,7 +196,7 @@ public static class AbpListExtensions
public static List<T> SortByDependencies<T>(
this IEnumerable<T> source,
Func<T, IEnumerable<T>> getDependencies,
IEqualityComparer<T> comparer = null)
IEqualityComparer<T>? comparer = null) where T : notnull
{
/* See: http://www.codeproject.com/Articles/869059/Topological-sorting-in-Csharp
* http://en.wikipedia.org/wiki/Topological_sorting
@ -222,7 +222,7 @@ public static class AbpListExtensions
/// <param name="sorted">List with the sortet items</param>
/// <param name="visited">Dictionary with the visited items</param>
private static void SortByDependenciesVisit<T>(T item, Func<T, IEnumerable<T>> getDependencies, List<T> sorted,
Dictionary<T, bool> visited)
Dictionary<T, bool> visited) where T : notnull
{
bool inProcess;
var alreadyVisited = visited.TryGetValue(item, out inProcess);

@ -42,7 +42,7 @@ public static class PredicateBuilder
}
/// <summary> Start an expression </summary>
public static ExpressionStarter<T> New<T>(Expression<Func<T, bool>> expr = null)
public static ExpressionStarter<T> New<T>(Expression<Func<T, bool>>? expr = null)
{
return new ExpressionStarter<T>(expr);
}
@ -58,7 +58,7 @@ public static class PredicateBuilder
[NotNull] Expression<Func<T, bool>> expr2)
{
var expr2Body = new RebindParameterVisitor(expr2.Parameters[0], expr1.Parameters[0]).Visit(expr2.Body);
return Expression.Lambda<Func<T, bool>>(Expression.OrElse(expr1.Body, expr2Body), expr1.Parameters);
return Expression.Lambda<Func<T, bool>>(Expression.OrElse(expr1.Body, expr2Body!), expr1.Parameters);
}
/// <summary> AND </summary>
@ -66,7 +66,7 @@ public static class PredicateBuilder
[NotNull] Expression<Func<T, bool>> expr2)
{
var expr2Body = new RebindParameterVisitor(expr2.Parameters[0], expr1.Parameters[0]).Visit(expr2.Body);
return Expression.Lambda<Func<T, bool>>(Expression.AndAlso(expr1.Body, expr2Body), expr1.Parameters);
return Expression.Lambda<Func<T, bool>>(Expression.AndAlso(expr1.Body, expr2Body!), expr1.Parameters);
}
/// <summary>
@ -120,16 +120,16 @@ public class ExpressionStarter<T>
}
}
public ExpressionStarter(Expression<Func<T, bool>> exp) : this(false)
public ExpressionStarter(Expression<Func<T, bool>>? exp) : this(false)
{
_predicate = exp;
}
/// <summary>The actual Predicate. It can only be set by calling Start.</summary>
private Expression<Func<T, bool>> Predicate =>
(IsStarted || !UseDefaultExpression) ? _predicate : DefaultExpression;
((IsStarted || !UseDefaultExpression) ? _predicate : DefaultExpression)!;
private Expression<Func<T, bool>> _predicate;
private Expression<Func<T, bool>>? _predicate;
/// <summary>Determines if the predicate is started.</summary>
public bool IsStarted => _predicate != null;
@ -138,7 +138,7 @@ public class ExpressionStarter<T>
public bool UseDefaultExpression => DefaultExpression != null;
/// <summary>The default expression</summary>
public Expression<Func<T, bool>> DefaultExpression { get; set; }
public Expression<Func<T, bool>>? DefaultExpression { get; set; }
/// <summary>Set the Expression predicate</summary>
/// <param name="exp">The first expression</param>
@ -165,7 +165,7 @@ public class ExpressionStarter<T>
}
/// <summary> Show predicate string </summary>
public override string ToString()
public override string? ToString()
{
return Predicate?.ToString();
}
@ -176,7 +176,7 @@ public class ExpressionStarter<T>
/// Allows this object to be implicitely converted to an Expression{Func{T, bool}}.
/// </summary>
/// <param name="right"></param>
public static implicit operator Expression<Func<T, bool>>(ExpressionStarter<T> right)
public static implicit operator Expression<Func<T, bool>>?(ExpressionStarter<T>? right)
{
return right?.Predicate;
}
@ -185,7 +185,7 @@ public class ExpressionStarter<T>
/// Allows this object to be implicitely converted to an Expression{Func{T, bool}}.
/// </summary>
/// <param name="right"></param>
public static implicit operator Func<T, bool>(ExpressionStarter<T> right)
public static implicit operator Func<T, bool>?(ExpressionStarter<T>? right)
{
return right == null ? null :
(right.IsStarted || right.UseDefaultExpression) ? right.Predicate.Compile() : null;
@ -195,7 +195,7 @@ public class ExpressionStarter<T>
/// Allows this object to be implicitely converted to an Expression{Func{T, bool}}.
/// </summary>
/// <param name="right"></param>
public static implicit operator ExpressionStarter<T>(Expression<Func<T, bool>> right)
public static implicit operator ExpressionStarter<T>?(Expression<Func<T, bool>>? right)
{
return right == null ? null : new ExpressionStarter<T>(right);
}
@ -240,7 +240,7 @@ public class ExpressionStarter<T>
#if !(NET35)
/// <summary></summary>
public string Name => Predicate.Name;
public string? Name => Predicate.Name;
/// <summary></summary>
public Type ReturnType => Predicate.ReturnType;

@ -6,6 +6,6 @@ public static class AbpAssemblyExtensions
{
public static string GetFileVersion(this Assembly assembly)
{
return FileVersionInfo.GetVersionInfo(assembly.Location).FileVersion;
return FileVersionInfo.GetVersionInfo(assembly.Location).FileVersion!;
}
}

@ -14,7 +14,7 @@ public static class AbpMemberInfoExtensions
/// <param name="memberInfo">The member that will be checked for the attribute</param>
/// <param name="inherit">Include inherited attributes</param>
/// <returns>Returns the attribute object if found. Returns null if not found.</returns>
public static TAttribute GetSingleAttributeOrNull<TAttribute>(this MemberInfo memberInfo, bool inherit = true)
public static TAttribute? GetSingleAttributeOrNull<TAttribute>(this MemberInfo memberInfo, bool inherit = true)
where TAttribute : Attribute
{
if (memberInfo == null)
@ -32,7 +32,7 @@ public static class AbpMemberInfoExtensions
}
public static TAttribute GetSingleAttributeOfTypeOrBaseTypesOrNull<TAttribute>(this Type type, bool inherit = true)
public static TAttribute? GetSingleAttributeOfTypeOrBaseTypesOrNull<TAttribute>(this Type type, bool inherit = true)
where TAttribute : Attribute
{
var attr = type.GetTypeInfo().GetSingleAttributeOrNull<TAttribute>();
@ -46,6 +46,6 @@ public static class AbpMemberInfoExtensions
return null;
}
return type.GetTypeInfo().BaseType.GetSingleAttributeOfTypeOrBaseTypesOrNull<TAttribute>(inherit);
return type.GetTypeInfo().BaseType?.GetSingleAttributeOfTypeOrBaseTypesOrNull<TAttribute>(inherit);
}
}

@ -5,6 +5,8 @@
<PropertyGroup>
<TargetFrameworks>netstandard2.0;netstandard2.1;net7.0</TargetFrameworks>
<Nullable>enable</Nullable>
<WarningsAsErrors>Nullable</WarningsAsErrors>
<AssemblyName>Volo.Abp.Core</AssemblyName>
<PackageId>Volo.Abp.Core</PackageId>
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>

@ -19,13 +19,13 @@ public abstract class AbpApplicationBase : IAbpApplication
[NotNull]
public Type StartupModuleType { get; }
public IServiceProvider ServiceProvider { get; private set; }
public IServiceProvider ServiceProvider { get; private set; } = default!;
public IServiceCollection Services { get; }
public IReadOnlyList<IAbpModuleDescriptor> Modules { get; }
public string ApplicationName { get; }
public string? ApplicationName { get; }
public string InstanceId { get; } = Guid.NewGuid().ToString();
@ -34,7 +34,7 @@ public abstract class AbpApplicationBase : IAbpApplication
internal AbpApplicationBase(
[NotNull] Type startupModuleType,
[NotNull] IServiceCollection services,
[CanBeNull] Action<AbpApplicationCreationOptions> optionsAction)
Action<AbpApplicationCreationOptions>? optionsAction)
{
Check.NotNull(startupModuleType, nameof(startupModuleType));
Check.NotNull(services, nameof(services));
@ -224,7 +224,7 @@ public abstract class AbpApplicationBase : IAbpApplication
{
if (module.Instance is AbpModule abpModule)
{
abpModule.ServiceConfigurationContext = null;
abpModule.ServiceConfigurationContext = null!;
}
}
@ -315,7 +315,7 @@ public abstract class AbpApplicationBase : IAbpApplication
{
if (module.Instance is AbpModule abpModule)
{
abpModule.ServiceConfigurationContext = null;
abpModule.ServiceConfigurationContext = null!;
}
}
@ -324,11 +324,11 @@ public abstract class AbpApplicationBase : IAbpApplication
TryToSetEnvironment(Services);
}
private static string GetApplicationName(AbpApplicationCreationOptions options)
private static string? GetApplicationName(AbpApplicationCreationOptions options)
{
if (!string.IsNullOrWhiteSpace(options.ApplicationName))
{
return options.ApplicationName;
return options.ApplicationName!;
}
var configuration = options.Services.GetConfigurationOrNull();
@ -337,7 +337,7 @@ public abstract class AbpApplicationBase : IAbpApplication
var appNameConfig = configuration["ApplicationName"];
if (!string.IsNullOrWhiteSpace(appNameConfig))
{
return appNameConfig;
return appNameConfig!;
}
}

@ -21,11 +21,9 @@ public class AbpApplicationCreationOptions
public bool SkipConfigureServices { get; set; }
[CanBeNull]
public string ApplicationName { get; set; }
public string? ApplicationName { get; set; }
[CanBeNull]
public string Environment { get; set; }
public string? Environment { get; set; }
public AbpApplicationCreationOptions([NotNull] IServiceCollection services)
{

@ -9,7 +9,7 @@ namespace Volo.Abp;
public static class AbpApplicationFactory
{
public async static Task<IAbpApplicationWithInternalServiceProvider> CreateAsync<TStartupModule>(
[CanBeNull] Action<AbpApplicationCreationOptions> optionsAction = null)
Action<AbpApplicationCreationOptions>? optionsAction = null)
where TStartupModule : IAbpModule
{
var app = Create(typeof(TStartupModule), options =>
@ -23,7 +23,7 @@ public static class AbpApplicationFactory
public async static Task<IAbpApplicationWithInternalServiceProvider> CreateAsync(
[NotNull] Type startupModuleType,
[CanBeNull] Action<AbpApplicationCreationOptions> optionsAction = null)
Action<AbpApplicationCreationOptions>? optionsAction = null)
{
var app = new AbpApplicationWithInternalServiceProvider(startupModuleType, options =>
{
@ -36,7 +36,7 @@ public static class AbpApplicationFactory
public async static Task<IAbpApplicationWithExternalServiceProvider> CreateAsync<TStartupModule>(
[NotNull] IServiceCollection services,
[CanBeNull] Action<AbpApplicationCreationOptions> optionsAction = null)
Action<AbpApplicationCreationOptions>? optionsAction = null)
where TStartupModule : IAbpModule
{
var app = Create(typeof(TStartupModule), services, options =>
@ -51,7 +51,7 @@ public static class AbpApplicationFactory
public async static Task<IAbpApplicationWithExternalServiceProvider> CreateAsync(
[NotNull] Type startupModuleType,
[NotNull] IServiceCollection services,
[CanBeNull] Action<AbpApplicationCreationOptions> optionsAction = null)
Action<AbpApplicationCreationOptions>? optionsAction = null)
{
var app = new AbpApplicationWithExternalServiceProvider(startupModuleType, services, options =>
{
@ -63,7 +63,7 @@ public static class AbpApplicationFactory
}
public static IAbpApplicationWithInternalServiceProvider Create<TStartupModule>(
[CanBeNull] Action<AbpApplicationCreationOptions> optionsAction = null)
Action<AbpApplicationCreationOptions>? optionsAction = null)
where TStartupModule : IAbpModule
{
return Create(typeof(TStartupModule), optionsAction);
@ -71,14 +71,14 @@ public static class AbpApplicationFactory
public static IAbpApplicationWithInternalServiceProvider Create(
[NotNull] Type startupModuleType,
[CanBeNull] Action<AbpApplicationCreationOptions> optionsAction = null)
Action<AbpApplicationCreationOptions>? optionsAction = null)
{
return new AbpApplicationWithInternalServiceProvider(startupModuleType, optionsAction);
}
public static IAbpApplicationWithExternalServiceProvider Create<TStartupModule>(
[NotNull] IServiceCollection services,
[CanBeNull] Action<AbpApplicationCreationOptions> optionsAction = null)
Action<AbpApplicationCreationOptions>? optionsAction = null)
where TStartupModule : IAbpModule
{
return Create(typeof(TStartupModule), services, optionsAction);
@ -87,7 +87,7 @@ public static class AbpApplicationFactory
public static IAbpApplicationWithExternalServiceProvider Create(
[NotNull] Type startupModuleType,
[NotNull] IServiceCollection services,
[CanBeNull] Action<AbpApplicationCreationOptions> optionsAction = null)
Action<AbpApplicationCreationOptions>? optionsAction = null)
{
return new AbpApplicationWithExternalServiceProvider(startupModuleType, services, optionsAction);
}

@ -10,7 +10,7 @@ internal class AbpApplicationWithExternalServiceProvider : AbpApplicationBase, I
public AbpApplicationWithExternalServiceProvider(
[NotNull] Type startupModuleType,
[NotNull] IServiceCollection services,
[CanBeNull] Action<AbpApplicationCreationOptions> optionsAction
Action<AbpApplicationCreationOptions>? optionsAction
) : base(
startupModuleType,
services,
@ -23,6 +23,7 @@ internal class AbpApplicationWithExternalServiceProvider : AbpApplicationBase, I
{
Check.NotNull(serviceProvider, nameof(serviceProvider));
// ReSharper disable once ConditionIsAlwaysTrueOrFalseAccordingToNullableAPIContract
if (ServiceProvider != null)
{
if (ServiceProvider != serviceProvider)

@ -7,11 +7,11 @@ namespace Volo.Abp;
internal class AbpApplicationWithInternalServiceProvider : AbpApplicationBase, IAbpApplicationWithInternalServiceProvider
{
public IServiceScope ServiceScope { get; private set; }
public IServiceScope? ServiceScope { get; private set; }
public AbpApplicationWithInternalServiceProvider(
[NotNull] Type startupModuleType,
[CanBeNull] Action<AbpApplicationCreationOptions> optionsAction
Action<AbpApplicationCreationOptions>? optionsAction
) : this(
startupModuleType,
new ServiceCollection(),
@ -23,7 +23,7 @@ internal class AbpApplicationWithInternalServiceProvider : AbpApplicationBase, I
private AbpApplicationWithInternalServiceProvider(
[NotNull] Type startupModuleType,
[NotNull] IServiceCollection services,
[CanBeNull] Action<AbpApplicationCreationOptions> optionsAction
Action<AbpApplicationCreationOptions>? optionsAction
) : base(
startupModuleType,
services,
@ -34,6 +34,7 @@ internal class AbpApplicationWithInternalServiceProvider : AbpApplicationBase, I
public IServiceProvider CreateServiceProvider()
{
// ReSharper disable once ConditionIsAlwaysTrueOrFalseAccordingToNullableAPIContract
if (ServiceProvider != null)
{
return ServiceProvider;
@ -42,7 +43,7 @@ internal class AbpApplicationWithInternalServiceProvider : AbpApplicationBase, I
ServiceScope = Services.BuildServiceProviderFromFactory().CreateScope();
SetServiceProvider(ServiceScope.ServiceProvider);
return ServiceProvider;
return ServiceProvider!;
}
public async Task InitializeAsync()

@ -2,5 +2,5 @@
public class AbpHostEnvironment : IAbpHostEnvironment
{
public string EnvironmentName { get; set; }
public string? EnvironmentName { get; set; }
}

@ -14,7 +14,7 @@ public class BundleContext
}
public void Add(string source, bool excludeFromBundle = false,
Dictionary<string, string> additionalProperties = null)
Dictionary<string, string>? additionalProperties = null)
{
var bundleDefinition = new BundleDefinition
{

@ -4,7 +4,7 @@ namespace Volo.Abp.Bundling;
public class BundleDefinition
{
public string Source { get; set; }
public string Source { get; set; } = default!;
public Dictionary<string, string> AdditionalProperties { get; set; }

@ -13,17 +13,17 @@ public class BusinessException : Exception,
IHasErrorDetails,
IHasLogLevel
{
public string Code { get; set; }
public string? Code { get; set; }
public string Details { get; set; }
public string? Details { get; set; }
public LogLevel LogLevel { get; set; }
public BusinessException(
string code = null,
string message = null,
string details = null,
Exception innerException = null,
string? code = null,
string? message = null,
string? details = null,
Exception? innerException = null,
LogLevel logLevel = LogLevel.Warning)
: base(message, innerException)
{

@ -136,8 +136,8 @@ public static class Check
return type;
}
public static string Length(
[CanBeNull] string value,
public static string? Length(
string? value,
[InvokerParameterName][NotNull] string parameterName,
int maxLength,
int minLength = 0)
@ -149,7 +149,7 @@ public static class Check
throw new ArgumentException(parameterName + " can not be null or empty!", parameterName);
}
if (value.Length < minLength)
if (value!.Length < minLength)
{
throw new ArgumentException($"{parameterName} length must be equal to or bigger than {minLength}!", parameterName);
}

@ -5,7 +5,7 @@ namespace Volo.Abp.Content;
public interface IRemoteStreamContent : IDisposable
{
string FileName { get; }
string? FileName { get; }
string ContentType { get; }

@ -8,13 +8,13 @@ public class RemoteStreamContent : IRemoteStreamContent
private readonly bool _disposeStream;
private bool _disposed;
public virtual string FileName { get; }
public virtual string? FileName { get; }
public virtual string ContentType { get; } = "application/octet-stream";
public virtual long? ContentLength { get; }
public RemoteStreamContent(Stream stream, string fileName = null, string contentType = null, long? readOnlyLength = null, bool disposeStream = true)
public RemoteStreamContent(Stream stream, string? fileName = null, string? contentType = null, long? readOnlyLength = null, bool disposeStream = true)
{
_stream = stream;

@ -28,12 +28,12 @@ public class AbpLazyServiceProvider :
return this.GetRequiredService(serviceType);
}
public virtual T LazyGetService<T>()
public virtual T? LazyGetService<T>()
{
return (T)LazyGetService(typeof(T));
return (T?)LazyGetService(typeof(T));
}
public virtual object LazyGetService(Type serviceType)
public virtual object? LazyGetService(Type serviceType)
{
return GetService(serviceType);
}

@ -6,26 +6,26 @@ namespace Volo.Abp.DependencyInjection;
public abstract class CachedServiceProviderBase : ICachedServiceProviderBase
{
protected IServiceProvider ServiceProvider { get; }
protected ConcurrentDictionary<Type, Lazy<object>> CachedServices { get; }
protected ConcurrentDictionary<Type, Lazy<object?>> CachedServices { get; }
protected CachedServiceProviderBase(IServiceProvider serviceProvider)
{
ServiceProvider = serviceProvider;
CachedServices = new ConcurrentDictionary<Type, Lazy<object>>();
CachedServices.TryAdd(typeof(IServiceProvider), new Lazy<object>(() => ServiceProvider));
CachedServices = new ConcurrentDictionary<Type, Lazy<object?>>();
CachedServices.TryAdd(typeof(IServiceProvider), new Lazy<object?>(() => ServiceProvider));
}
public virtual object GetService(Type serviceType)
public virtual object? GetService(Type serviceType)
{
return CachedServices.GetOrAdd(
serviceType,
_ => new Lazy<object>(() => ServiceProvider.GetService(serviceType))
_ => new Lazy<object?>(() => ServiceProvider.GetService(serviceType))
).Value;
}
public T GetService<T>(T defaultValue)
{
return (T)GetService(typeof(T), defaultValue);
return (T)GetService(typeof(T), defaultValue!);
}
public object GetService(Type serviceType, object defaultValue)
@ -42,7 +42,7 @@ public abstract class CachedServiceProviderBase : ICachedServiceProviderBase
{
return CachedServices.GetOrAdd(
serviceType,
_ => new Lazy<object>(() => factory(ServiceProvider))
).Value;
_ => new Lazy<object?>(() => factory(ServiceProvider))
).Value!;
}
}

@ -52,12 +52,12 @@ public abstract class ConventionalRegistrarBase : IConventionalRegistrar
}
}
protected virtual DependencyAttribute GetDependencyAttributeOrNull(Type type)
protected virtual DependencyAttribute? GetDependencyAttributeOrNull(Type type)
{
return type.GetCustomAttribute<DependencyAttribute>(true);
}
protected virtual ServiceLifetime? GetLifeTimeOrNull(Type type, [CanBeNull] DependencyAttribute dependencyAttribute)
protected virtual ServiceLifetime? GetLifeTimeOrNull(Type type, DependencyAttribute? dependencyAttribute)
{
return dependencyAttribute?.Lifetime ?? GetServiceLifetimeFromClassHierarchy(type) ?? GetDefaultLifeTimeOrNull(type);
}
@ -110,7 +110,7 @@ public abstract class ConventionalRegistrarBase : IConventionalRegistrar
{
return ServiceDescriptor.Describe(
exposingServiceType,
provider => provider.GetService(redirectedType),
provider => provider.GetService(redirectedType)!,
lifeTime
);
}
@ -123,7 +123,7 @@ public abstract class ConventionalRegistrarBase : IConventionalRegistrar
);
}
protected virtual Type GetRedirectedTypeOrNull(
protected virtual Type? GetRedirectedTypeOrNull(
Type implementationType,
Type exposingServiceType,
List<Type> allExposingServiceTypes)

@ -24,13 +24,13 @@ public interface IAbpLazyServiceProvider : ICachedServiceProviderBase
/// This method is equivalent of the GetService method.
/// It does exists for backward compatibility.
/// </summary>
T LazyGetService<T>();
T? LazyGetService<T>();
/// <summary>
/// This method is equivalent of the GetService method.
/// It does exists for backward compatibility.
/// </summary>
object LazyGetService(Type serviceType);
object? LazyGetService(Type serviceType);
/// <summary>
/// This method is equivalent of the <see cref="ICachedServiceProviderBase.GetService{T}(T)"/> method.

@ -4,6 +4,5 @@ namespace Volo.Abp.DependencyInjection;
public interface IObjectAccessor<out T>
{
[CanBeNull]
T Value { get; }
T? Value { get; }
}

@ -4,14 +4,14 @@ namespace Volo.Abp.DependencyInjection;
public class ObjectAccessor<T> : IObjectAccessor<T>
{
public T Value { get; set; }
public T? Value { get; set; }
public ObjectAccessor()
{
}
public ObjectAccessor([CanBeNull] T obj)
public ObjectAccessor(T? obj)
{
Value = obj;
}

@ -9,10 +9,10 @@ public class RootServiceProvider : IRootServiceProvider, ISingletonDependency
public RootServiceProvider(IObjectAccessor<IServiceProvider> objectAccessor)
{
ServiceProvider = objectAccessor.Value;
ServiceProvider = objectAccessor.Value!;
}
public virtual object GetService(Type serviceType)
public virtual object? GetService(Type serviceType)
{
return ServiceProvider.GetService(serviceType);
}

@ -37,8 +37,7 @@ public class DisposeAction<T> : IDisposable
{
private readonly Action<T> _action;
[CanBeNull]
private readonly T _parameter;
private readonly T? _parameter;
/// <summary>
/// Creates a new <see cref="DisposeAction"/> object.
@ -55,6 +54,9 @@ public class DisposeAction<T> : IDisposable
public void Dispose()
{
_action(_parameter);
if (_parameter != null)
{
_action(_parameter);
}
}
}

@ -28,7 +28,7 @@ public static class ProxyHelper
return obj;
}
return targetField.GetValue(obj);
return targetField.GetValue(obj)!;
}
public static Type GetUnProxiedType(object obj)
@ -36,15 +36,12 @@ public static class ProxyHelper
if (obj.GetType().Namespace == ProxyNamespace)
{
var target = UnProxy(obj);
if (target != null)
if (target == obj)
{
if (target == obj)
{
return obj.GetType().GetTypeInfo().BaseType;
}
return target.GetType();
return obj.GetType().GetTypeInfo().BaseType!;
}
return target.GetType();
}
return obj.GetType();

@ -2,5 +2,5 @@
public interface IHasErrorCode
{
string Code { get; }
string? Code { get; }
}

@ -2,5 +2,5 @@ namespace Volo.Abp.ExceptionHandling;
public interface IHasErrorDetails
{
string Details { get; }
string? Details { get; }
}

@ -2,5 +2,5 @@
public interface IAbpHostEnvironment
{
string EnvironmentName { get; set; }
string? EnvironmentName { get; set; }
}

@ -9,8 +9,7 @@ public interface IApplicationInfoAccessor
/// This is useful for systems with multiple applications, to distinguish
/// resources of the applications located together.
/// </summary>
[CanBeNull]
string ApplicationName { get; }
string? ApplicationName { get; }
/// <summary>
/// A unique identifier for this application instance.

@ -36,8 +36,7 @@ public static class FileHelper
/// Returns extension without dot.
/// Returns null if given <paramref name="fileNameWithExtension"></paramref> does not include dot.
/// </returns>
[CanBeNull]
public static string GetExtension([NotNull] string fileNameWithExtension)
public static string? GetExtension([NotNull] string fileNameWithExtension)
{
Check.NotNull(fileNameWithExtension, nameof(fileNameWithExtension));
@ -90,7 +89,7 @@ public static class FileHelper
/// <param name="fileOptions">Indicates FileStream options. Default is Asynchronous (The file is to be used for asynchronous reading.) and SequentialScan (The file is to be accessed sequentially from beginning to end.) </param>
/// <returns>A string containing all lines of the file.</returns>
public static async Task<string[]> ReadAllLinesAsync(string path,
Encoding encoding = null,
Encoding? encoding = null,
FileMode fileMode = FileMode.Open,
FileAccess fileAccess = FileAccess.Read,
FileShare fileShare = FileShare.Read,
@ -114,7 +113,7 @@ public static class FileHelper
{
using (var reader = new StreamReader(stream, encoding))
{
string line;
string? line;
while ((line = await reader.ReadLineAsync()) != null)
{
lines.Add(line);
@ -134,6 +133,6 @@ public static class FileHelper
{
var content = await ReadAllBytesAsync(path);
return StringHelper.ConvertFromBytesWithoutBom(content);
return StringHelper.ConvertFromBytesWithoutBom(content)!;
}
}

@ -7,7 +7,7 @@ namespace Volo.Abp.Localization;
public static class CultureHelper
{
public static IDisposable Use([NotNull] string culture, string uiCulture = null)
public static IDisposable Use([NotNull] string culture, string? uiCulture = null)
{
Check.NotNull(culture, nameof(culture));
@ -19,7 +19,7 @@ public static class CultureHelper
);
}
public static IDisposable Use([NotNull] CultureInfo culture, CultureInfo uiCulture = null)
public static IDisposable Use([NotNull] CultureInfo culture, CultureInfo? uiCulture = null)
{
Check.NotNull(culture, nameof(culture));

@ -9,11 +9,11 @@ public class AbpInitLogEntry
public EventId EventId { get; set; }
public object State { get; set; }
public object State { get; set; } = default!;
public Exception Exception { get; set; }
public Exception? Exception { get; set; }
public Func<object, Exception, string> Formatter { get; set; }
public Func<object, Exception?, string> Formatter { get; set; } = default!;
public string Message => Formatter(State, Exception);
}

@ -13,13 +13,13 @@ public class DefaultInitLogger<T> : IInitLogger<T>
Entries = new List<AbpInitLogEntry>();
}
public virtual void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
public virtual void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception? exception, Func<TState, Exception?, string> formatter)
{
Entries.Add(new AbpInitLogEntry
{
LogLevel = logLevel,
EventId = eventId,
State = state,
State = state!,
Exception = exception,
Formatter = (s, e) => formatter((TState)s, e),
});
@ -30,7 +30,7 @@ public class DefaultInitLogger<T> : IInitLogger<T>
return logLevel != LogLevel.None;
}
public virtual IDisposable BeginScope<TState>(TState state)
public virtual IDisposable BeginScope<TState>(TState state) where TState : notnull
{
return NullDisposable.Instance;
}

@ -29,7 +29,7 @@ public abstract class AbpModule :
internal set => _serviceConfigurationContext = value;
}
private ServiceConfigurationContext _serviceConfigurationContext;
private ServiceConfigurationContext? _serviceConfigurationContext;
public virtual Task PreConfigureServicesAsync(ServiceConfigurationContext context)
{

@ -12,7 +12,7 @@ public class DependsOnAttribute : Attribute, IDependedTypesProvider
[NotNull]
public Type[] DependedTypes { get; }
public DependsOnAttribute(params Type[] dependedTypes)
public DependsOnAttribute(params Type[]? dependedTypes)
{
DependedTypes = dependedTypes ?? new Type[0];
}

@ -85,7 +85,7 @@ public class ModuleLoader : IModuleLoader
protected virtual IAbpModule CreateAndRegisterModule(IServiceCollection services, Type moduleType)
{
var module = (IAbpModule)Activator.CreateInstance(moduleType);
var module = (IAbpModule)Activator.CreateInstance(moduleType)!;
services.AddSingleton(moduleType, module);
return module;
}

@ -8,7 +8,7 @@ public class FilePlugInSource : IPlugInSource
{
public string[] FilePaths { get; }
public FilePlugInSource(params string[] filePaths)
public FilePlugInSource(params string[]? filePaths)
{
FilePaths = filePaths ?? new string[0];
}

@ -15,7 +15,7 @@ public class FolderPlugInSource : IPlugInSource
public SearchOption SearchOption { get; set; }
public Func<string, bool> Filter { get; set; }
public Func<string, bool>? Filter { get; set; }
public FolderPlugInSource(
[NotNull] string folder,

@ -7,7 +7,7 @@ public class TypePlugInSource : IPlugInSource
{
private readonly Type[] _moduleTypes;
public TypePlugInSource(params Type[] moduleTypes)
public TypePlugInSource(params Type[]? moduleTypes)
{
_moduleTypes = moduleTypes ?? new Type[0];
}

@ -8,7 +8,7 @@ public class ServiceConfigurationContext
{
public IServiceCollection Services { get; }
public IDictionary<string, object> Items { get; }
public IDictionary<string, object?> Items { get; }
/// <summary>
/// Gets/sets arbitrary named objects those can be stored during
@ -19,7 +19,7 @@ public class ServiceConfigurationContext
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public object this[string key] {
public object? this[string key] {
get => Items.GetOrDefault(key);
set => Items[key] = value;
}
@ -27,6 +27,6 @@ public class ServiceConfigurationContext
public ServiceConfigurationContext([NotNull] IServiceCollection services)
{
Services = Check.NotNull(services, nameof(services));
Items = new Dictionary<string, object>();
Items = new Dictionary<string, object?>();
}
}

@ -29,12 +29,12 @@ public class NameValue<T>
/// <summary>
/// Name.
/// </summary>
public string Name { get; set; }
public string Name { get; set; } = default!;
/// <summary>
/// Value.
/// </summary>
public T Value { get; set; }
public T Value { get; set; } = default!;
public NameValue()
{

@ -9,8 +9,8 @@ namespace Volo.Abp;
public static class ObjectHelper
{
private static readonly ConcurrentDictionary<string, PropertyInfo> CachedObjectProperties =
new ConcurrentDictionary<string, PropertyInfo>();
private static readonly ConcurrentDictionary<string, PropertyInfo?> CachedObjectProperties =
new ConcurrentDictionary<string, PropertyInfo?>();
public static void TrySetProperty<TObject, TValue>(
TObject obj,
@ -25,9 +25,9 @@ public static class ObjectHelper
TObject obj,
Expression<Func<TObject, TValue>> propertySelector,
Func<TObject, TValue> valueFactory,
params Type[] ignoreAttributeTypes)
params Type[]? ignoreAttributeTypes)
{
var cacheKey = $"{obj.GetType().FullName}-" +
var cacheKey = $"{obj?.GetType().FullName}-" +
$"{propertySelector}-" +
$"{(ignoreAttributeTypes != null ? "-" + string.Join("-", ignoreAttributeTypes.Select(x => x.FullName)) : "")}";
@ -40,7 +40,7 @@ public static class ObjectHelper
var memberExpression = propertySelector.Body.As<MemberExpression>();
var propertyInfo = obj.GetType().GetProperties().FirstOrDefault(x =>
var propertyInfo = obj?.GetType().GetProperties().FirstOrDefault(x =>
x.Name == memberExpression.Member.Name &&
x.GetSetMethod(true) != null);

@ -9,7 +9,7 @@ public class AbpOptionsFactory<TOptions> : IOptionsFactory<TOptions> where TOpti
{
private readonly IEnumerable<IConfigureOptions<TOptions>> _setups;
private readonly IEnumerable<IPostConfigureOptions<TOptions>> _postConfigures;
private readonly IEnumerable<IValidateOptions<TOptions>> _validations;
private readonly IEnumerable<IValidateOptions<TOptions>>? _validations;
public AbpOptionsFactory(
IEnumerable<IConfigureOptions<TOptions>> setups,
@ -22,7 +22,7 @@ public class AbpOptionsFactory<TOptions> : IOptionsFactory<TOptions> where TOpti
public AbpOptionsFactory(
IEnumerable<IConfigureOptions<TOptions>> setups,
IEnumerable<IPostConfigureOptions<TOptions>> postConfigures,
IEnumerable<IValidateOptions<TOptions>> validations)
IEnumerable<IValidateOptions<TOptions>>? validations)
{
_setups = setups;
_postConfigures = postConfigures;

@ -31,7 +31,7 @@ internal static class AssemblyHelper
}
catch (ReflectionTypeLoadException ex)
{
return ex.Types;
return ex.Types!;
}
}
}

@ -80,7 +80,7 @@ public static class ReflectionHelper
/// <param name="memberInfo">MemberInfo</param>
/// <param name="defaultValue">Default value (null as default)</param>
/// <param name="inherit">Inherit attribute from base classes</param>
public static TAttribute GetSingleAttributeOrDefault<TAttribute>(MemberInfo memberInfo, TAttribute defaultValue = default, bool inherit = true)
public static TAttribute? GetSingleAttributeOrDefault<TAttribute>(MemberInfo memberInfo, TAttribute? defaultValue = default, bool inherit = true)
where TAttribute : Attribute
{
//Get attribute on the member
@ -100,7 +100,7 @@ public static class ReflectionHelper
/// <param name="memberInfo">MemberInfo</param>
/// <param name="defaultValue">Default value (null as default)</param>
/// <param name="inherit">Inherit attribute from base classes</param>
public static TAttribute GetSingleAttributeOfMemberOrDeclaringTypeOrDefault<TAttribute>(MemberInfo memberInfo, TAttribute defaultValue = default, bool inherit = true)
public static TAttribute? GetSingleAttributeOfMemberOrDeclaringTypeOrDefault<TAttribute>(MemberInfo memberInfo, TAttribute? defaultValue = default, bool inherit = true)
where TAttribute : class
{
return memberInfo.GetCustomAttributes(true).OfType<TAttribute>().FirstOrDefault()
@ -128,7 +128,7 @@ public static class ReflectionHelper
/// <summary>
/// Gets value of a property by it's full path from given object
/// </summary>
public static object GetValueByPath(object obj, Type objectType, string propertyPath)
public static object? GetValueByPath(object obj, Type objectType, string propertyPath)
{
var value = obj;
var currentType = objectType;
@ -167,7 +167,7 @@ public static class ReflectionHelper
{
var currentType = objectType;
PropertyInfo property;
var objectPath = currentType.FullName;
var objectPath = currentType.FullName!;
var absolutePropertyPath = propertyPath;
if (absolutePropertyPath.StartsWith(objectPath))
{
@ -178,19 +178,19 @@ public static class ReflectionHelper
if (properties.Length == 1)
{
property = objectType.GetProperty(properties.First());
property = objectType.GetProperty(properties.First())!;
property.SetValue(obj, value);
return;
}
for (int i = 0; i < properties.Length - 1; i++)
{
property = currentType.GetProperty(properties[i]);
obj = property.GetValue(obj, null);
property = currentType.GetProperty(properties[i])!;
obj = property.GetValue(obj, null)!;
currentType = property.PropertyType;
}
property = currentType.GetProperty(properties.Last());
property = currentType.GetProperty(properties.Last())!;
property.SetValue(obj, value);
}
@ -215,7 +215,7 @@ public static class ReflectionHelper
constants.AddRange(targetType.GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy)
.Where(x => x.IsLiteral && !x.IsInitOnly)
.Select(x => x.GetValue(null).ToString()));
.Select(x => x.GetValue(null)!.ToString()!));
var nestedTypes = targetType.GetNestedTypes(BindingFlags.Public);

@ -43,7 +43,7 @@ public static class TypeHelper
return NonNullablePrimitiveTypes.Contains(type);
}
public static bool IsFunc(object obj)
public static bool IsFunc(object? obj)
{
if (obj == null)
{
@ -59,7 +59,7 @@ public static class TypeHelper
return type.GetGenericTypeDefinition() == typeof(Func<>);
}
public static bool IsFunc<TReturn>(object obj)
public static bool IsFunc<TReturn>(object? obj)
{
return obj != null && obj.GetType() == typeof(Func<TReturn>);
}
@ -88,13 +88,13 @@ public static class TypeHelper
{
if (t.GetGenericArguments().Length > 0 && t.GetGenericTypeDefinition() == typeof(Nullable<>))
{
return t.GetGenericArguments().FirstOrDefault();
return t.GetGenericArguments().First();
}
return t;
}
public static bool IsEnumerable(Type type, out Type itemType, bool includePrimitives = true)
public static bool IsEnumerable(Type type, out Type? itemType, bool includePrimitives = true)
{
if (!includePrimitives && IsPrimitiveExtended(type))
{
@ -119,7 +119,7 @@ public static class TypeHelper
return false;
}
public static bool IsDictionary(Type type, out Type keyType, out Type valueType)
public static bool IsDictionary(Type type, out Type? keyType, out Type? valueType)
{
var dictionaryTypes = ReflectionHelper
.GetImplementedGenericTypes(
@ -167,12 +167,12 @@ public static class TypeHelper
type == typeof(Guid);
}
public static T GetDefaultValue<T>()
public static T? GetDefaultValue<T>()
{
return default;
}
public static object GetDefaultValue(Type type)
public static object? GetDefaultValue(Type type)
{
if (type.IsValueType)
{
@ -194,7 +194,8 @@ public static class TypeHelper
if (type.IsGenericType)
{
var genericType = type.GetGenericTypeDefinition();
return $"{genericType.FullName.Left(genericType.FullName.IndexOf('`'))}<{type.GenericTypeArguments.Select(GetFullNameHandlingNullableAndGenerics).JoinAsString(",")}>";
var genericTypeFullName = genericType.FullName!;
return $"{genericTypeFullName.Left(genericTypeFullName.IndexOf('`'))}<{type.GenericTypeArguments.Select(GetFullNameHandlingNullableAndGenerics).JoinAsString(",")}>";
}
return type.FullName ?? type.Name;
@ -212,7 +213,8 @@ public static class TypeHelper
if (type.IsGenericType)
{
var genericType = type.GetGenericTypeDefinition();
return $"{genericType.FullName.Left(genericType.FullName.IndexOf('`'))}<{type.GenericTypeArguments.Select(GetSimplifiedName).JoinAsString(",")}>";
var genericTypeFullName = genericType.FullName!;
return $"{genericTypeFullName.Left(genericTypeFullName.IndexOf('`'))}<{type.GenericTypeArguments.Select(GetSimplifiedName).JoinAsString(",")}>";
}
if (type == typeof(string))
@ -303,12 +305,12 @@ public static class TypeHelper
return type.FullName ?? type.Name;
}
public static object ConvertFromString<TTargetType>(string value)
public static object? ConvertFromString<TTargetType>(string value)
{
return ConvertFromString(typeof(TTargetType), value);
}
public static object ConvertFromString(Type targetType, string value)
public static object? ConvertFromString(Type targetType, string? value)
{
if (value == null)
{
@ -354,7 +356,7 @@ public static class TypeHelper
{
return TypeDescriptor
.GetConverter(targetType)
.ConvertFrom(value);
.ConvertFrom(value)!;
}
public static Type StripNullable(Type type)
@ -364,7 +366,7 @@ public static class TypeHelper
: type;
}
public static bool IsDefaultValue([CanBeNull] object obj)
public static bool IsDefaultValue(object? obj)
{
if (obj == null)
{

@ -22,7 +22,7 @@ public class RemoteServiceAttribute : Attribute //TODO: Can we move this to anot
/// Group names of all services of a module expected to be the same.
/// This name is also used to distinguish the service endpoint of this group.
/// </summary>
public string Name { get; set; }
public string Name { get; set; } = default!;
public RemoteServiceAttribute(bool isEnabled = true)
{

@ -4,9 +4,9 @@ namespace Volo.Abp.SimpleStateChecking;
public interface ISimpleStateCheckerSerializer
{
public string Serialize<TState>(ISimpleStateChecker<TState> checker)
public string? Serialize<TState>(ISimpleStateChecker<TState> checker)
where TState : IHasSimpleStateCheckers<TState>;
public ISimpleStateChecker<TState> Deserialize<TState>(JsonObject jsonObject, TState state)
public ISimpleStateChecker<TState>? Deserialize<TState>(JsonObject jsonObject, TState state)
where TState : IHasSimpleStateCheckers<TState>;
}

@ -5,11 +5,9 @@ namespace Volo.Abp.SimpleStateChecking;
public interface ISimpleStateCheckerSerializerContributor
{
[CanBeNull]
public string SerializeToJson<TState>(ISimpleStateChecker<TState> checker)
public string? SerializeToJson<TState>(ISimpleStateChecker<TState> checker)
where TState : IHasSimpleStateCheckers<TState>;
[CanBeNull]
public ISimpleStateChecker<TState> Deserialize<TState>(JsonObject jsonObject, TState state)
public ISimpleStateChecker<TState>? Deserialize<TState>(JsonObject jsonObject, TState state)
where TState : IHasSimpleStateCheckers<TState>;
}

@ -16,8 +16,7 @@ public class SimpleStateCheckerSerializer :
_contributors = contributors;
}
[CanBeNull]
public string Serialize<TState>(ISimpleStateChecker<TState> checker)
public string? Serialize<TState>(ISimpleStateChecker<TState> checker)
where TState : IHasSimpleStateCheckers<TState>
{
foreach (var contributor in _contributors)
@ -32,8 +31,7 @@ public class SimpleStateCheckerSerializer :
return null;
}
[CanBeNull]
public ISimpleStateChecker<TState> Deserialize<TState>(JsonObject jsonObject, TState state)
public ISimpleStateChecker<TState>? Deserialize<TState>(JsonObject jsonObject, TState state)
where TState : IHasSimpleStateCheckers<TState>
{
foreach (var contributor in _contributors)

@ -7,7 +7,7 @@ namespace Volo.Abp.SimpleStateChecking;
public static class SimpleStateCheckerSerializerExtensions
{
public static string Serialize<TState>(
public static string? Serialize<TState>(
this ISimpleStateCheckerSerializer serializer,
IList<ISimpleStateChecker<TState>> stateCheckers)
where TState : IHasSimpleStateCheckers<TState>
@ -73,7 +73,7 @@ public static class SimpleStateCheckerSerializerExtensions
return new[] { checker };
}
var checkers = new List<ISimpleStateChecker<TState>>();
var checkers = new List<ISimpleStateChecker<TState>?>();
for (var i = 0; i < array.Count; i++)
{
@ -85,6 +85,6 @@ public static class SimpleStateCheckerSerializerExtensions
checkers.Add(serializer.Deserialize(jsonObject, state));
}
return checkers.Where(x => x != null).ToArray();
return checkers.Where(x => x != null).ToArray()!;
}
}

@ -68,7 +68,7 @@ public class FormattedStringValueExtracter
Debug.Assert(previousToken != null, "previousToken can not be null since i > 0 here");
result.Matches.Add(new NameValue(previousToken.Text, str.Substring(0, matchIndex)));
result.Matches.Add(new NameValue(previousToken!.Text, str.Substring(0, matchIndex)));
str = str.Substring(matchIndex + currentToken.Text.Length);
}
}

@ -10,7 +10,7 @@ public class StringHelper
/// <param name="bytes">The byte[] to be converted to string</param>
/// <param name="encoding">The encoding to get string. Default is UTF8</param>
/// <returns></returns>
public static string ConvertFromBytesWithoutBom(byte[] bytes, Encoding encoding = null)
public static string? ConvertFromBytesWithoutBom(byte[]? bytes, Encoding? encoding = null)
{
if (bytes == null)
{

@ -9,9 +9,9 @@ namespace Volo.Abp.Threading;
//TODO: Cache GetMethod reflection!
public static class InternalAsyncHelper
{
public static async Task AwaitTaskWithFinally(Task actualReturnValue, Action<Exception> finalAction)
public static async Task AwaitTaskWithFinally(Task actualReturnValue, Action<Exception?> finalAction)
{
Exception exception = null;
Exception? exception = null;
try
{
@ -28,9 +28,9 @@ public static class InternalAsyncHelper
}
}
public static async Task AwaitTaskWithPostActionAndFinally(Task actualReturnValue, Func<Task> postAction, Action<Exception> finalAction)
public static async Task AwaitTaskWithPostActionAndFinally(Task actualReturnValue, Func<Task> postAction, Action<Exception?> finalAction)
{
Exception exception = null;
Exception? exception = null;
try
{
@ -48,9 +48,9 @@ public static class InternalAsyncHelper
}
}
public static async Task AwaitTaskWithPreActionAndPostActionAndFinally(Func<Task> actualReturnValue, Func<Task> preAction = null, Func<Task> postAction = null, Action<Exception> finalAction = null)
public static async Task AwaitTaskWithPreActionAndPostActionAndFinally(Func<Task> actualReturnValue, Func<Task>? preAction = null, Func<Task>? postAction = null, Action<Exception?>? finalAction = null)
{
Exception exception = null;
Exception? exception = null;
try
{
@ -80,9 +80,9 @@ public static class InternalAsyncHelper
}
}
public static async Task<T> AwaitTaskWithFinallyAndGetResult<T>(Task<T> actualReturnValue, Action<Exception> finalAction)
public static async Task<T> AwaitTaskWithFinallyAndGetResult<T>(Task<T> actualReturnValue, Action<Exception?> finalAction)
{
Exception exception = null;
Exception? exception = null;
try
{
@ -103,14 +103,14 @@ public static class InternalAsyncHelper
{
return typeof(InternalAsyncHelper)
.GetTypeInfo()
.GetMethod("AwaitTaskWithFinallyAndGetResult", BindingFlags.Public | BindingFlags.Static)
.GetMethod("AwaitTaskWithFinallyAndGetResult", BindingFlags.Public | BindingFlags.Static)!
.MakeGenericMethod(taskReturnType)
.Invoke(null, new object[] { actualReturnValue, finalAction });
.Invoke(null, new object[] { actualReturnValue, finalAction })!;
}
public static async Task<T> AwaitTaskWithPostActionAndFinallyAndGetResult<T>(Task<T> actualReturnValue, Func<Task> postAction, Action<Exception> finalAction)
public static async Task<T> AwaitTaskWithPostActionAndFinallyAndGetResult<T>(Task<T> actualReturnValue, Func<Task> postAction, Action<Exception?> finalAction)
{
Exception exception = null;
Exception? exception = null;
try
{
@ -133,14 +133,14 @@ public static class InternalAsyncHelper
{
return typeof(InternalAsyncHelper)
.GetTypeInfo()
.GetMethod("AwaitTaskWithPostActionAndFinallyAndGetResult", BindingFlags.Public | BindingFlags.Static)
.GetMethod("AwaitTaskWithPostActionAndFinallyAndGetResult", BindingFlags.Public | BindingFlags.Static)!
.MakeGenericMethod(taskReturnType)
.Invoke(null, new object[] { actualReturnValue, action, finalAction });
.Invoke(null, new object[] { actualReturnValue, action, finalAction })!;
}
public static async Task<T> AwaitTaskWithPreActionAndPostActionAndFinallyAndGetResult<T>(Func<Task<T>> actualReturnValue, Func<Task> preAction = null, Func<Task> postAction = null, Action<Exception> finalAction = null)
public static async Task<T> AwaitTaskWithPreActionAndPostActionAndFinallyAndGetResult<T>(Func<Task<T>> actualReturnValue, Func<Task>? preAction = null, Func<Task>? postAction = null, Action<Exception?>? finalAction = null)
{
Exception exception = null;
Exception? exception = null;
try
{
@ -169,19 +169,19 @@ public static class InternalAsyncHelper
}
}
public static object CallAwaitTaskWithPreActionAndPostActionAndFinallyAndGetResult(Type taskReturnType, Func<object> actualReturnValue, Func<Task> preAction = null, Func<Task> postAction = null, Action<Exception> finalAction = null)
public static object CallAwaitTaskWithPreActionAndPostActionAndFinallyAndGetResult(Type taskReturnType, Func<object> actualReturnValue, Func<Task>? preAction = null, Func<Task>? postAction = null, Action<Exception>? finalAction = null)
{
var returnFunc = typeof(InternalAsyncHelper)
.GetTypeInfo()
.GetMethod("ConvertFuncOfObjectToFuncOfTask", BindingFlags.NonPublic | BindingFlags.Static)
.GetMethod("ConvertFuncOfObjectToFuncOfTask", BindingFlags.NonPublic | BindingFlags.Static)!
.MakeGenericMethod(taskReturnType)
.Invoke(null, new object[] { actualReturnValue });
return typeof(InternalAsyncHelper)
.GetTypeInfo()
.GetMethod("AwaitTaskWithPreActionAndPostActionAndFinallyAndGetResult", BindingFlags.Public | BindingFlags.Static)
.GetMethod("AwaitTaskWithPreActionAndPostActionAndFinallyAndGetResult", BindingFlags.Public | BindingFlags.Static)!
.MakeGenericMethod(taskReturnType)
.Invoke(null, new object[] { returnFunc, preAction, postAction, finalAction });
.Invoke(null, new object?[] { returnFunc, preAction, postAction, finalAction })!;
}
[UsedImplicitly]

@ -12,9 +12,9 @@ public class UserFriendlyException : BusinessException, IUserFriendlyException
{
public UserFriendlyException(
string message,
string code = null,
string details = null,
Exception innerException = null,
string? code = null,
string? details = null,
Exception? innerException = null,
LogLevel logLevel = LogLevel.Warning)
: base(
code,

@ -8,7 +8,7 @@ namespace Volo.Abp.Validation;
public class DynamicMaxLengthAttribute : MaxLengthAttribute
{
private static readonly FieldInfo MaximumLengthField;
private static readonly FieldInfo? MaximumLengthField;
static DynamicMaxLengthAttribute()
{
@ -21,7 +21,7 @@ public class DynamicMaxLengthAttribute : MaxLengthAttribute
public DynamicMaxLengthAttribute(
[NotNull] Type sourceType,
[CanBeNull] string maximumLengthPropertyName)
string? maximumLengthPropertyName)
{
Check.NotNull(sourceType, nameof(sourceType));
@ -32,7 +32,7 @@ public class DynamicMaxLengthAttribute : MaxLengthAttribute
BindingFlags.Static | BindingFlags.Public
);
Debug.Assert(maximumLengthProperty != null, nameof(maximumLengthProperty) + " != null");
MaximumLengthField.SetValue(this, (int)maximumLengthProperty.GetValue(null));
MaximumLengthField?.SetValue(this, (int)maximumLengthProperty?.GetValue(null)!);
}
}
}

@ -8,8 +8,8 @@ namespace Volo.Abp.Validation;
public class DynamicRangeAttribute : RangeAttribute
{
private static readonly FieldInfo MaximumField;
private static readonly FieldInfo MinimumField;
private static readonly FieldInfo? MaximumField;
private static readonly FieldInfo? MinimumField;
static DynamicRangeAttribute()
{
@ -33,8 +33,8 @@ public class DynamicRangeAttribute : RangeAttribute
public DynamicRangeAttribute(
[NotNull] Type sourceType,
[NotNull] Type operandType,
[CanBeNull] string minimumPropertyName,
[CanBeNull] string maximumPropertyName
string? minimumPropertyName,
string? maximumPropertyName
)
: base(operandType, string.Empty, string.Empty)
{
@ -47,7 +47,7 @@ public class DynamicRangeAttribute : RangeAttribute
BindingFlags.Static | BindingFlags.Public
);
Debug.Assert(minimumProperty != null, nameof(minimumProperty) + " != null");
MinimumField.SetValue(this, minimumProperty.GetValue(null));
MinimumField?.SetValue(this, minimumProperty?.GetValue(null));
}
if (maximumPropertyName != null)
@ -57,7 +57,7 @@ public class DynamicRangeAttribute : RangeAttribute
BindingFlags.Static | BindingFlags.Public
);
Debug.Assert(maximumProperty != null, nameof(maximumProperty) + " != null");
MaximumField.SetValue(this, maximumProperty.GetValue(null));
MaximumField?.SetValue(this, maximumProperty?.GetValue(null));
}
}
}

@ -12,7 +12,7 @@ namespace Volo.Abp.Validation;
/// </summary>
public class DynamicStringLengthAttribute : StringLengthAttribute
{
private static readonly FieldInfo MaximumLengthField;
private static readonly FieldInfo? MaximumLengthField;
static DynamicStringLengthAttribute()
{
@ -28,8 +28,8 @@ public class DynamicStringLengthAttribute : StringLengthAttribute
/// <param name="minimumLengthPropertyName">The name of the public static property for the <see cref="StringLengthAttribute.MinimumLength"/></param>
public DynamicStringLengthAttribute(
[NotNull] Type sourceType,
[CanBeNull] string maximumLengthPropertyName,
[CanBeNull] string minimumLengthPropertyName = null)
string? maximumLengthPropertyName,
string? minimumLengthPropertyName = null)
: base(0)
{
Check.NotNull(sourceType, nameof(sourceType));
@ -41,7 +41,7 @@ public class DynamicStringLengthAttribute : StringLengthAttribute
BindingFlags.Static | BindingFlags.Public
);
Debug.Assert(maximumLengthProperty != null, nameof(maximumLengthProperty) + " != null");
MaximumLengthField.SetValue(this, (int)maximumLengthProperty.GetValue(null));
MaximumLengthField?.SetValue(this, (int)maximumLengthProperty?.GetValue(null)!);
}
if (minimumLengthPropertyName != null)
@ -51,7 +51,7 @@ public class DynamicStringLengthAttribute : StringLengthAttribute
BindingFlags.Static | BindingFlags.Public
);
Debug.Assert(minimumLengthProperty != null, nameof(minimumLengthProperty) + " != null");
MinimumLength = (int)minimumLengthProperty.GetValue(null);
MinimumLength = (int)minimumLengthProperty?.GetValue(null)!;
}
}
}

Loading…
Cancel
Save