C # Статические типы не могут быть использованы в качестве параметров - PullRequest
16 голосов
/ 07 марта 2012
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

Как лучше всего с этим справиться?

Ответы [ 7 ]

19 голосов
/ 07 марта 2012

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

6 голосов
/ 13 ноября 2012

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

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

Например. Звонок:

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

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

    static void Main(string[] args)
    {

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

        Console.ReadKey();

    }
1 голос
/ 07 марта 2012

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

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

1 голос
/ 07 марта 2012

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

1 голос
/ 07 марта 2012

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

0 голосов
/ 25 июля 2014

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

0 голосов
/ 07 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...