【问题标题】:C# Static types cannot be used as parametersC# 静态类型不能用作参数
【发布时间】:2012-03-24 14:33:01
【问题描述】:
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# asp.net types static


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 这是我的想法,在我的情况下解决这个问题的好方法是什么?
      • @TomGullen 这是一个static 类,因此您似乎不需要为您的逻辑实例化它。您可以在您的方法中引用该类。您不需要将其作为参数传递,甚至不需要在方法中引用参数名称。只需将类名引用为static 就足够了。你已经在你的方法中正确地做到了。长话短说,只需取出参数即可。
      • 除非类型参数指定了“新”约束,否则指定为类型参数的类不能用于实例化。因此,在没有“新”约束的情况下不能将静态类型作为参数传递仍然没有意义。
      【解决方案4】:

      为参数使用不同的类型。

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          不推荐,但您可以模拟使用静态类作为参数。 像这样创建一个实例类:

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

          【讨论】:

            【解决方案7】:

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

            【讨论】:

            • 您不能将引用传递给静态类。您可以通过类型名称访问静态成员。
            【解决方案8】:

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

            功能:

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

            调用函数:

            Function(static param);
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-09-26
              • 2016-09-28
              • 2012-08-06
              • 1970-01-01
              相关资源
              最近更新 更多