2012-03-07 128 views
11
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); 
     } 
    } 

    .... 
} 

Como se puede ver la MediaTypeNames AttachmentType tiros el error:C# tipos estáticos no pueden ser utilizados como parámetros

'System.Net.Mime.MediaTypeNames': static types cannot be used as parameters 

¿Cuál es la mejor manera de lidiar con esto?

+0

Probablemente desee utilizar "cadena" como tipo. MediaTypeNames tiene varias clases dentro de ella, cada una con algunas propiedades estáticas que devuelven cadenas. – PlayDeezGames

+0

http://stackoverflow.com/questions/5858591/c-sharp-static-types-cannot-be-used-as-type-arguments –

Respuesta

15

No puede pasar un tipo estático a un método como parámetro porque entonces tendría que crearse una instancia, y no puede crear una instancia de static clase.

+0

Esto es lo que pensé, ¿cuál sería una buena manera de resolver este problema en ¿mi caso? –

+0

@TomGullen Es una clase 'estática', por lo que no parece necesitar crear una instancia para su lógica.Puedes simplemente hacer referencia a la clase dentro de tu método. No necesita pasarlo como parámetro, y ni siquiera hace referencia al nombre del parámetro en su método. Solo bastará con hacer referencia al nombre de la clase como 'static '. Ya lo haces correctamente en tu método. En resumen, acaba de sacar el parámetro y debería estar todo listo. –

+0

Una clase especificada como parámetro de tipo no se puede usar para la creación de instancias a menos que el parámetro de tipo haya especificado una restricción "nueva". Por lo tanto, aún no tiene sentido no poder pasar un tipo estático como parámetro sin la restricción "nueva". – Daniel

0

Lo mejor es definitivamente eliminar el último parámetro. Como el tipo es estático, no necesita una referencia a una instancia y puede hacer referencia a sus miembros desde su cuerpo de función.

0

Puede envolver tipos estáticos alrededor de la interfaz u otra clase no estática y agregar eso como el parámetro. No es ideal, sino una forma de evitarlo. O simplemente simplemente haga referencia al tipo estático en el propio cuerpo del método

1

Utilice un tipo diferente para el argumento.

Un argumento de método debe ser de un tipo que pueda aceptar una referencia a una instancia, por lo que no puede ser una clase estática.

0

Parece que ni siquiera usa ese parámetro en su método. Solo debe eliminarlo porque MediaTypeNames no se puede crear una instancia de todos modos.

4

No se recomienda pero puede simular el uso de clases estáticas como parámetros. Crear una clase de instancia como esta:

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

} 

Luego, su función en la que se usaría la clase estática:

private static void YourFunction(Instance instance) 
    { 
     instance.Call("TheNameOfMethodToCall", null); 
    } 

Para instance.Call:

  • El primer parámetro es el nombre del método de su clase estática para llamar al
  • El segundo parámetro es la lista de argumentos para pasar al método.

Y el uso de la siguiente manera:

static void Main(string[] args) 
    { 

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

     Console.ReadKey(); 

    } 
-1

Enviar una clase estática como el tipo del parámetro y luego darle un nombre de variable para su uso en la función. Esto funciona porque la nueva variable es una referencia a la clase estática. Es necesario abordar el problema de variable global. Si utiliza una clase estática como variable dentro de un método, , necesita pasarlo como un parámetro, para evitar el problema de variable global. Esta es la programación básica estructurada 101 de los años 80.

+0

No puede pasar una referencia a una clase estática. Accedes a los miembros estáticos a través del nombre del tipo. –

Cuestiones relacionadas