Skip to content

Set internal modifier on extension methods on object CloudinaryDotNet.Core.SystemExtension #387

@Natlink

Description

@Natlink

Removing of a "feature" request for Cloudinary .NET SDK

CloudinaryDotNet.Core add extensions methods to object base type, which might be used by the library itselve, but shouldn't be public and usable on a project using this library.
The two following extension methods must be internal only:

namespace CloudinaryDotNet.Core;

public static class SystemExtension
{
  /// <summary>Clones the object.</summary>
  /// <param name="source">The source to clone.</param>
  /// <typeparam name="T">Object type.</typeparam>
  /// <returns>New instance of the cloned object.</returns>
  public static T Clone<T>(this T source)
  {
    return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject((object) source));
  }

  /// <summary>
  /// Copies the writable properties from the source object to the destination object.
  /// </summary>
  /// <param name="source">The source object whose properties will be copied.</param>
  /// <param name="destination">The destination object where the properties will be copied.</param>
  public static void CopyPropertiesTo(this object source, object destination)
  {
    foreach (PropertyInfo runtimeProperty in typeof (FileDescription).GetRuntimeProperties())
    {
      if (runtimeProperty.CanWrite)
      {
        object obj = runtimeProperty.GetValue(source);
        runtimeProperty.SetValue(destination, obj);
      }
    }
  }
}

Explain your use case

I shouldn't be able to use these methods on any object of my domain, system object, etc.
For example, this code is "syntaxically" ok, but absolutely not in execution:

        System.Net.Http.SocketsHttpHandler handler = new System.Net.Http.SocketsHttpHandler();
        handler.Clone();

Describe the problem you’re trying to solve

From my point of view, this is the responsibility of each projects to add the extension methods they need on base system type.
When I use a library to simplify access to cloudinary API, i don't expect to get some system type helper methods, which:

  1. will not works as i expect regarding they naming. Each people will have a different perception of what a "Clone" method do, maybe from your use case, Json IN/OUT is enough, but for another person, it will not be the case.
  2. will create a dependence on the library outside of the desired scope. (CloudinaryDotNet.Core would be used only on a "CdnConnectorService", but might be used everywhere because of that. )

Do you have a proposed solution?

Set these methods / extension class as internal instead of public.

(thanks for your work on the library btw! :) )

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions