Eu só queria dizer que às vezes os delegados resolvem esses problemas, dependendo do contexto.
Se você precisar chamar o método estático como algum tipo de fábrica ou método de inicialização, então você pode declarar um delegado e passar o método estático para a fábrica genérica relevante ou o que quer que precise dessa "classe genérica com este método estático".
Por exemplo:
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();
}
}
Infelizmente, você não pode garantir que a classe tenha o método certo, mas pode pelo menos garantir que o método de fábrica resultante tenha tudo o que espera (ou seja, um método de inicialização com a assinatura correta). Isso é melhor do que uma exceção de reflexão de tempo de execução.
Essa abordagem também tem alguns benefícios, ou seja, você pode reutilizar métodos init, fazer com que sejam métodos de instância, etc.