2011-06-30 16 views
11

Estoy tratando de crear una funcionalidad adicional para la clase String (IsNullOrWhitespace como en .NET4) pero estoy teniendo un problema con la referencia:C# 3.5 clase parcial cadena IsNullOrWhiteSpace

de error 1 'Cadena' es una referencia ambigua entre 'string' y 'geolis_export.Classes.String'

No quiero crear un método de extensión. Debido a que este se bloqueará si string x = null;

Uso:

private void tbCabineNum_PreviewTextInput(object sender, TextCompositionEventArgs e) 
{ 
    e.Handled = !e.Text.All(Char.IsNumber) || String.IsNullOrWhiteSpace(e.Text); 
} 

cadena parcial:

public partial class String 
{ 
    public static bool IsNullOrWhiteSpace(string value) 
    { 
     if (value == null) return true; 
     return string.IsNullOrEmpty(value.Trim()); 
    } 
} 

No es posible la creación de extras para la clase String? He intentado poner el parcial en el espacio de nombre System, pero esto da otros errores.

Renombrar String a String2 soluciona el problema también. Pero esto no es lo que quiero, porque entonces no hay referencia con la clase original String.

+3

'Debido a que este se bloqueará si "cadena x = null;"' - comprobar los hechos en primer lugar; Además, repetir ciegamente esa declaración en una respuesta perfecta, insulta la inteligencia de la persona que lo está ayudando. Esto fue fácil de probar primero – sehe

Respuesta

41

No es posible así porque la clase string en .NET Framework no es parcial.
En su lugar, utilizan un método de extensión real de esta manera:

public static class StringExtensions 
{ 
    public static bool IsNullOrWhiteSpace(this string value) 
    { 
     if (value == null) return true; 
     return string.IsNullOrEmpty(value.Trim()); 
    } 
} 

El uso sería entonces así:

string s = "test"; 
if(s.IsNullOrWhiteSpace()) 
    // s is null or whitespace 

Al igual que con todos los métodos de extensión, la llamada no dar lugar a una excepción de referencia nula si la cadena es null:

string s = null; 
if(s.IsNullOrWhiteSpace()) // no exception here 
    // s is null or whitespace 

la razón de este comportamiento es que el compilador se traducirá este código en código IL que es equivalente al código IL de los siguientes:

método
string s = null; 
if(StringExtensions.IsNullOrWhiteSpace(s)) 
    // s is null or whitespace 
+0

@Stinus: Correcto, faltaste que los métodos de extensión deben vivir en una clase 'estática' y tener solo métodos 'estáticos'. También deben aceptar un parámetro 'this String' como primer argumento del método (suponiendo que extienda' String'). – Yuck

+1

¿No deberías devolver verdadero si la cadena es nula? –

+0

+1 como métodos de extensión son el camino a seguir. – TheBoyan

6

Una extensión tiene que ser definido como un método estático dentro de una clase estática . También observe la palabra clave this en el parámetro.

public static class MyExtensions 
{ 
    public static bool IsNullorWhitespace(this string input) 
    { 
     // perform logic 
    } 
} 

Lo que ha hecho omitiendo la static en la clase es definir una clase que compiten dentro de su montaje, por lo tanto, el mensaje ambiguo del compilador.

+0

+1 como métodos de extensión son el camino a seguir. – TheBoyan

0

Para crear un método de extensión, debe usar la siguiente sintaxis. (Tenga en cuenta el uso de la palabra clave this):

public static bool IsNullOrWhiteSpace(this string value) 
2

La clase string no se ha declarado como parcial, tendrá que escribir un método de extensión en su lugar.

1
public static class MyExtensions 
{ 
    public static bool IsNullOrWhiteSpace(this string value) 
    { 
     if (value == null) return false; 
     return string.IsNullOrEmpty(value.Trim()); 
    } 
} 
0

Así no se crea un método de extensión. La clase no es parcial, debe ser una clase estática y se puede llamar cualquier cosa (MyExtensionMethods). También necesita marcar su parámetro con "this" en un método de extensión.

Tal vez puedas probar

public static class StringExtensions 
{ 
    public static bool IsNullOrWhiteSpace(this string value) 
    { 
     if (value == null) return true; 
     return string.IsNullOrEmpty(value.Trim()); 
    } 
} 
Cuestiones relacionadas