Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#静态类型不能用作参数_C#_Asp.net_Types_Static - Fatal编程技术网

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

C#静态类型不能用作参数,c#,asp.net,types,static,C#,Asp.net,Types,Static,如您所见,MediaTypeNames AttachmentType抛出错误: public static void SendEmail(String from, String To, String Subject, String HTML, String AttachmentPath = null, String AttachmentName = null, MediaTypeNames AttachmentType = null) { .... // Add an atta

如您所见,
MediaTypeNames AttachmentType
抛出错误:

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

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

'System.Net.Mime.MediaTypeNames': static types cannot be used as parameters
    private static void YourFunction(Instance instance)
    {
        instance.Call("TheNameOfMethodToCall", null);
    }
然后使用静态类的函数:

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

}
例如,打电话:

  • 第一个参数是要调用的静态类的方法的名称
  • 第二个参数是要传递给方法的参数列表
然后像这样使用:

'System.Net.Mime.MediaTypeNames': static types cannot be used as parameters
    private static void YourFunction(Instance instance)
    {
        instance.Call("TheNameOfMethodToCall", null);
    }

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

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

功能:

    static void Main(string[] args)
    {

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

        Console.ReadKey();

    }
调用函数:

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

这就是我所想的,在我的例子中,解决这个问题的好方法是什么?@TomGullen它是一个
静态
类,所以你似乎不需要为你的逻辑实例化它。您可以只引用方法中的类。您不需要将其作为参数传递,甚至不需要在方法中引用参数名。仅将类名引用为
static
就足够了。你已经在你的方法中正确地做到了。长话短说,只要去掉参数,就应该全部设置好。指定为类型参数的类不能用于实例化,除非类型参数指定了“新”约束。因此,在没有“new”约束的情况下不能将静态类型作为参数传递仍然没有意义。您可能希望使用“string”作为类型。MediaTypeNames中有许多类,每个类都有一些返回字符串的静态属性。您不能传递对静态类的引用。您可以通过类型名访问静态成员。