dotnet / runtime

.NET is a cross-platform runtime for cloud, mobile, desktop, and IoT apps.
https://docs.microsoft.com/dotnet/core/
MIT License
15.05k stars 4.69k forks source link

[API Proposal]: "Multipart/form-data" serializer #104050

Open Mr0N opened 3 months ago

Mr0N commented 3 months ago

Background and motivation

I propose to add the "Multipart/form-data" serializer; this is just an example to make it clear what I am suggesting.

API Proposal

using System;
using System.Collections.Concurrent;
using System.Reflection;

using var client = new HttpClient();
//var form = new MultipartFormDataContent();
var obj = new MultipartContentSerialization();
var multiForm = obj.Serialization(new Info() { FirstName = "12345", LastName = "12345", Hash = "hash" });
client.PostAsync("https://google.com/test", multiForm).GetAwaiter().GetResult();

class MultipartContentSerialization
{
    public MultipartFormDataContent Serialization<T>(T obj)
    {
        var form = new MultipartFormDataContent();
        var property = obj.GetType()
           .GetProperties(BindingFlags.Public | BindingFlags.Instance);
        foreach (var item in property)
        {
            object propertyObj = item.GetValue(obj);
            var result = item.GetCustomAttribute<NamePropertyMultiformAttribute>();
            if (propertyObj is string res)
            {
                if (result is null)
                    form.Add(new StringContent(res), item.Name);
                else
                    form.Add(new StringContent(res), result.Name);
            }
            else
            {
                throw new Exception("This type is not support");
            }

        }
        return form;
    }
}
class NamePropertyMultiformAttribute(string name) : Attribute
{
    public string Name => name;
}
class Info
{
    public required string FirstName { set; get; }
    public required string LastName { set; get; }
    [NamePropertyMultiformAttribute("User Id")]
    public required string Hash { set; get; }
}

API Usage

-

Alternative Designs

No response

Risks

No response

colejohnson66 commented 3 months ago

Any API that uses reflection is probably not a good one. It’s slow and not trimming/AOT safe.

Mr0N commented 3 months ago

Any API that uses reflection is probably not a good one. It’s slow and not trimming/AOT safe.

Well, I'm not suggesting using reflection for this, it's just an example. I suggest using IL generation and similar approaches. I'm not sure what System.Text.Json uses, but it's quite fast

colejohnson66 commented 3 months ago

In that case, your API proposal is wrongly written. You don't need to provide working code, just the API "shape"; You only need to explain what it does. As is, your proposal reads like reflection would be required.