¿Cuál es el equivalente de los comodines de Java en C # generics

Estoy desarrollando una aplicación en la que necesito invocar un método de una clase genérica y no me importa el tipo real de las instancias. Algo así como el siguiente código Java:

public class Item<T>{
  private T item;

  public doSomething(){...}
}

...
public void processItems(Item<?>[] items){
 for(Item<?> item : items)
   item.doSomething();
}

n el momento en que tenía prisa, resolví mi problema definiendo una interfaz con los métodos que necesitaba invocar e hice que la clase genérica lo implementara.

public interface IItem  
{
   void doSomething();
}

public class Item<T> : IItem {
  private T item;

  public void doSomething(){...}
}

...
public void processItems(IItem[] items)
{
 foreach(IItem item in items)
   item.doSomething();
}

Esta solución funciona bien, pero me gustaría saber cuál es la forma correcta de lograr el mismo comportamiento.

EDITAR

Olvidé referirme a que la persona que llamó aprocessItems no conoce los tipos reales. En realidad, la idea era que la matriz pasara como argumento aprocessItems podría contener tipos entremezclados. Dado que no es posible tener una matriz de este tipo en .Net, el uso de una clase o interfaz base no genérica parece ser la única manera.

Respuestas a la pregunta(5)

Su respuesta a la pregunta