2010-12-20 20 views
10

Cómo puedo escribir un método genérico que puede tomar un objeto Nullable para usar como método de extensión. Quiero agregar un elemento XElement a un elemento primario, pero solo si el valor que se va a usar no es nulo.Nullable <T> para el método genérico en C#?

p. Ej.

public static XElement AddOptionalElement<T>(this XElement parentElement, string childname, T childValue){ 
... 
code to check if value is null 
add element to parent here if not null 
... 
} 

Si hago esta AddOptionalElement<T?>(...) en cuando me siento errores de compilación. Si hago esto AddOptionalElement<Nullable<T>>(...) entonces obtengo errores del compilador.

¿Hay alguna manera de lograr esto?

Sé que puedo hacer mi llamada al método:

parent.AddOptionalElement<MyType?>(...) 

pero es esta la única manera?

Respuesta

12
public static XElement AddOptionalElement<T>(
    this XElement parentElement, string childname, T? childValue) 
    where T : struct 
{ 
    // ... 
} 
+0

El tipo de 'T' debe ser un tipo de valor no anulable con el fin de utilizarlo como parámetro de 'T' en el tipo genérico o método 'System.Nullable ' – BlueChippy

+0

Se aún tendrá el error del compilador ya que necesitamos indicar que T no debe contener nulos. –

+0

@BlueChippy: ¡Estaba arreglando eso como lo comentó! – LukeH

4

Necesitas limitar T ser un struct - de lo contrario no puede ser anulable.

public static XElement AddOptionalElement<T>(this XElement parentElement, 
              string childname, 
              T? childValue) where T: struct { ... } 
+0

No es el "esto" que debe ser anulable, sino uno de los otros parámetros. p.ej. MethodName (este padre XElement, valor "NeedANullableHere") – BlueChippy

+0

Editado ... su "tomar un objeto Nullable para usar como método de extensión" fue un poco confuso. – Lucero

1

tratar
AddOptionalElement<T>(T? param) where T: struct { ... }

0

The Nullable tipo tiene la restricción where T : struct, new() por lo que su método obviuosly debe contener la restricción struct hacer Nullable<T> funcionando bien. El método resultante debe ser similar:

public static XElement AddOptionalElement<T>(this XElement parentElement, string childname, T? childValue) where T : struct 
    { 
     // TODO: your implementation here 
    } 
+2

'struct' implica' new() 'como restricción, no es necesario agregarlo explícitamente. – Lucero

+1

Reparado, gracias por su nota. –

Cuestiones relacionadas