Solo quería decir que a veces los delegados resuelven estos problemas, según el contexto.
Si necesita llamar al método estático como una especie de fábrica o método de inicialización, entonces puede declarar un delegado y pasar el método estático a la fábrica genérica relevante o lo que sea que necesite esta "clase genérica con este método estático".
Por ejemplo:
class Factory<TProduct> where TProduct : new()
{
public delegate void ProductInitializationMethod(TProduct newProduct);
private ProductInitializationMethod m_ProductInitializationMethod;
public Factory(ProductInitializationMethod p_ProductInitializationMethod)
{
m_ProductInitializationMethod = p_ProductInitializationMethod;
}
public TProduct CreateProduct()
{
var prod = new TProduct();
m_ProductInitializationMethod(prod);
return prod;
}
}
class ProductA
{
public static void InitializeProduct(ProductA newProduct)
{
// .. Do something with a new ProductA
}
}
class ProductB
{
public static void InitializeProduct(ProductB newProduct)
{
// .. Do something with a new ProductA
}
}
class GenericAndDelegateTest
{
public static void Main()
{
var factoryA = new Factory<ProductA>(ProductA.InitializeProduct);
var factoryB = new Factory<ProductB>(ProductB.InitializeProduct);
ProductA prodA = factoryA.CreateProduct();
ProductB prodB = factoryB.CreateProduct();
}
}
Desafortunadamente, no puede hacer cumplir que la clase tenga el método correcto, pero al menos puede hacer cumplir en tiempo de compilación que el método de fábrica resultante tenga todo lo que espera (es decir, un método de inicialización con exactamente la firma correcta). Esto es mejor que una excepción de reflexión en tiempo de ejecución.
Este enfoque también tiene algunos beneficios, es decir, puede reutilizar métodos init, hacer que sean métodos de instancia, etc.