public static void SendEmail(String from, String To, String Subject, String HTML, String AttachmentPath = null, String AttachmentName = null, MediaTypeNames AttachmentType = null)
{
....
// Add an attachment if required
if (AttachmentPath != null)
{
var ct = new ContentType(MediaTypeNames.Text.Plain);
using (var a = new Attachment(AttachmentPath, ct)
{
Name = AttachmentName,
NameEncoding = Encoding.UTF8,
TransferEncoding = TransferEncoding.Base64
})
{
mailMessage.Attachments.Add(a);
}
}
....
}
Comme vous pouvez le voir, le MediaTypeNames AttachmentType
renvoie l'erreur:
'System.Net.Mime.MediaTypeNames': static types cannot be used as parameters
Quelle est la meilleure façon de gérer cela?
Vous ne pouvez pas passer un type statique à une méthode en tant que paramètre car il devrait alors être instancié et vous ne pouvez pas créer d'instance d'une classe static
.
Ce n'est pas recommandé, mais vous pouvez simuler l'utilisation de classes statiques en tant que paramètres. Créez une classe d'instance comme celle-ci:
public class Instance
{
public Type StaticObject { get; private set; }
public Instance(Type staticType)
{
StaticObject = staticType;
}
public object Call(string name, params object[] parameters)
{
MethodInfo method = StaticObject.GetMethod(name);
return method.Invoke(StaticObject, parameters);
}
public object Call(string name)
{
return Call(name, null);
}
}
Ensuite, votre fonction où vous utiliseriez la classe statique:
private static void YourFunction(Instance instance)
{
instance.Call("TheNameOfMethodToCall", null);
}
Par exemple.Appel:
Et utilisez comme ceci:
static void Main(string[] args)
{
YourFunction(new Instance(typeof(YourStaticClass)));
Console.ReadKey();
}
Le mieux est de supprimer définitivement le dernier paramètre. Comme le type est statique, vous n'avez pas besoin de faire référence à une instance et vous pouvez faire référence à ses membres à partir du corps de votre fonction.
Vous pouvez envelopper des types statiques autour de et une interface ou une autre classe non statique et l'ajouter en tant que paramètre. Pas idéal mais un moyen de contourner le problème. Ou simplement référencer le type statique dans le corps de la méthode
Utilisez un type différent pour l'argument.
Un argument de méthode doit être d'un type pouvant accepter une référence à une instance. Par conséquent, il ne peut s'agir d'une classe statique.
Envoyez une classe statique en tant que type du paramètre , Puis attribuez-lui un nom de variable à utiliser dans la fonction. Cela fonctionne car la nouvelle variable est une référence à la classe statique. Il est nécessaire de résoudre le problème de la variable globale. Si vous utilisez une classe statique en tant que variable dans une méthode, Vous devez la transmettre en tant que paramètre pour éviter la variable globale. Il s’agit de la programmation structurée de base 101 des années 80.
Il ne semble pas que vous utilisiez même ce paramètre dans votre méthode. Vous devriez simplement le supprimer car MediaTypeNames
ne peut de toute façon pas être instancié.