using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Swan.Lite.Reflection;
using Swan.Mappers;
using Swan.Reflection;
namespace Swan
{
///
/// Extension methods.
///
public static partial class Extensions
{
///
/// Iterates over the public, instance, readable properties of the source and
/// tries to write a compatible value to a public, instance, writable property in the destination.
///
/// The type of the source.
/// The source.
/// The target.
/// The ignore properties.
///
/// Number of properties that was copied successful.
///
public static int CopyPropertiesTo(this T source, object target, params string[]? ignoreProperties)
where T : class =>
ObjectMapper.Copy(source, target, GetCopyableProperties(target), ignoreProperties);
///
/// Iterates over the public, instance, readable properties of the source and
/// tries to write a compatible value to a public, instance, writable property in the destination.
///
/// The source.
/// The destination.
/// Properties to copy.
///
/// Number of properties that were successfully copied.
///
public static int CopyOnlyPropertiesTo(this object source, object target, params string[]? propertiesToCopy)
=> ObjectMapper.Copy(source, target, propertiesToCopy);
///
/// Copies the properties to new instance of T.
///
/// The new object type.
/// The source.
/// The ignore properties.
///
/// The specified type with properties copied.
///
/// source.
public static T CopyPropertiesToNew(this object source, string[]? ignoreProperties = null)
where T : class
{
if (source == null)
throw new ArgumentNullException(nameof(source));
var target = Activator.CreateInstance();
ObjectMapper.Copy(source, target, GetCopyableProperties(target), ignoreProperties);
return target;
}
///
/// Copies the only properties to new instance of T.
///
/// Object Type.
/// The source.
/// The properties to copy.
///
/// The specified type with properties copied.
///
/// source.
public static T CopyOnlyPropertiesToNew(this object source, params string[] propertiesToCopy)
where T : class
{
if (source == null)
throw new ArgumentNullException(nameof(source));
var target = Activator.CreateInstance();
ObjectMapper.Copy(source, target, propertiesToCopy);
return target;
}
///
/// Iterates over the keys of the source and tries to write a compatible value to a public,
/// instance, writable property in the destination.
///
/// The source.
/// The target.
/// The ignore keys.
/// Number of properties that was copied successful.
public static int CopyKeyValuePairTo(
this IDictionary source,
object target,
params string[] ignoreKeys) =>
source == null
? throw new ArgumentNullException(nameof(source))
: ObjectMapper.Copy(source, target, null, ignoreKeys);
///
/// Iterates over the keys of the source and tries to write a compatible value to a public,
/// instance, writable property in the destination.
///
/// Object Type.
/// The source.
/// The ignore keys.
///
/// The specified type with properties copied.
///
public static T CopyKeyValuePairToNew(
this IDictionary source,
params string[] ignoreKeys)
{
if (source == null)
throw new ArgumentNullException(nameof(source));
var target = Activator.CreateInstance();
source.CopyKeyValuePairTo(target, ignoreKeys);
return target;
}
///
/// Does the specified action.
///
/// The action.
/// The retry interval.
/// The retry count.
public static void Retry(
this Action action,
TimeSpan retryInterval = default,
int retryCount = 3)
{
if (action == null)
throw new ArgumentNullException(nameof(action));
Retry