Подтвердить что ты не робот

С# Статические типы не могут использоваться как параметры

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);
        }
    }

    ....
}

Как вы видите, MediaTypeNames AttachmentType выдает ошибку:

'System.Net.Mime.MediaTypeNames': static types cannot be used as parameters

Каков наилучший способ справиться с этим?

4b9b3361

Ответ 1

Вы не можете передать статический тип методу в качестве параметра, потому что тогда его нужно было бы создать, и вы не сможете создать экземпляр класса static.

Ответ 2

Не рекомендуется, но вы можете имитировать использование статических классов в качестве параметров. Создайте класс экземпляра следующим образом:

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);
    }

}

Тогда ваша функция, в которой вы будете использовать статический класс:

    private static void YourFunction(Instance instance)
    {
        instance.Call("TheNameOfMethodToCall", null);
    }

Например: Call:

  • Первый параметр - это имя метода вашего статического класса для вызова
  • Второй параметр - это список аргументов, передаваемых методу.

И используйте вот так:

    static void Main(string[] args)
    {

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

        Console.ReadKey();

    }

Ответ 3

Используйте другой тип аргумента.

Аргумент метода должен быть типа, который может принимать ссылку на экземпляр, поэтому он не может быть статическим классом.

Ответ 4

Лучшая сделка - это, безусловно, удалить последний параметр. Поскольку тип является статическим, вам не нужна ссылка на экземпляр, и вы можете ссылаться на его членов из вашего тела функции.

Ответ 5

Вы можете обернуть статические типы вокруг и интерфейс или другой нестатический класс и добавить это как параметр. Не идеальный, а способ вокруг него. Или просто просто укажите статический тип в самом теле метода

Ответ 6

Не похоже, что вы даже используете этот параметр в своем методе. Вы должны просто удалить его, потому что MediaTypeNames не может быть создан в любом случае.

Ответ 7

Отправить статический класс как тип параметра а затем дать ему имя переменной для использования в функции. Это работает, потому что новая переменная является ссылкой на статический класс. Необходимо решить проблему глобальных переменных. Если вы используете статический класс как переменную внутри метода, вам необходимо передать его как параметр, чтобы избежать проблемы с глобальной переменной. Это базовое структурированное программирование 101 с 80-х годов.