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

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 

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

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

不建议这样做,但您可以模拟使用静态类作为参数。 创建一个这样的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(); } 

您可以包装静态类型和接口或另一个非静态类,并将其添加为参数。 不理想,但绕过它。 或者只是简单地引用方法体本身中的静态类型

为参数使用不同的类型。

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

最好的交易肯定是删除最后一个参数。 由于type是static,因此您不需要对实例的引用,您可以从函数体中引用它的成员。

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

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