using System.Net.Mail; using System.Reflection; using NejCommon.Emails; namespace NejCommon.Services.Email; public interface IEmailService { Task SendEmailAsync(string recipient, string subject, string message, List? attachments = null); async Task SendDocumentAsync(string recipient, T2 data, List? attachments = null) where T : EmailBase { var func = typeof(T).GetMethod("GetHTML", BindingFlags.Static | BindingFlags.FlattenHierarchy | BindingFlags.Public); var obj = Activator.CreateInstance(); obj.Data = data; var subject = obj.GetSubject(); //invoke the GetHTML function asynchronously and wait for the result var html = await (Task)func.Invoke(null, new object[] { data }); await SendEmailAsync(recipient, subject, html, attachments); } }