web-dev-qa-db-fra.com

Les types statiques C # ne peuvent pas être utilisés comme paramètres

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?

15
Tom Gullen

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.

19
user596075

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:

  • Le premier paramètre est le nom de la méthode de votre classe statique à appeler
  • Le deuxième paramètre est la liste des arguments à transmettre à la méthode.

Et utilisez comme ceci:

    static void Main(string[] args)
    {

        YourFunction(new Instance(typeof(YourStaticClass)));

        Console.ReadKey();

    }
6
csblo

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.

1
Primary Key

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

1
aqwert

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.

1
Andrew Cooper

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.

0
Nikolai

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é.

0
user370770