C# 静态类型不能用作参数

本文关键字:参数 不能 类型 静态 静态类 | 更新日期: 2023-09-27 18:27:03

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

处理这个问题的最佳方法是什么?

C# 静态类型不能用作参数

不能将静态类型作为参数传递给方法,因为这样就必须实例化该方法,并且不能创建static类的实例。

不建议这样做,但您可以模拟使用静态类作为参数。创建一个实例类,如下所示:

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

最好的交易肯定是删除最后一个参数。由于类型是静态的,因此不需要引用实例,可以从函数体引用其成员。

对参数使用不同的类型。

方法参数必须是可以接受对实例的引用的类型,因此它不能是静态类。

您可以将静态类型包装在接口或其他非静态类周围,并将其添加为参数。不理想,但可以解决它。或者只是在方法主体本身中引用静态类型。

发送静态类作为参数的类型然后为其指定一个变量名称以在函数中使用。这是有效的,因为新变量是对静态类的引用。有必要解决全局变量问题。如果使用静态类作为方法中的变量,您需要将其作为参数传入,以避免全局变量问题。这是80年代的基本结构化编程101。

看起来您甚至没有在方法中使用该参数。您应该删除它,因为无论如何MediaTypeNames都无法实例化。

传递静态参数的解决方法是将其作为对象传递。

功能:

public static void HoldKey(object key)
{
   ...
}

调用功能:

Function(static param);