Я просто хотел показать, что иногда делегаты решают эти проблемы в зависимости от контекста.
Если вам нужно вызывать статический метод как своего рода метод фабрики или инициализации, тогда вы можете объявить делегат и передать статический метод в соответствующую универсальную фабрику или тому, кому нужен этот "универсальный класс с этим статическим метод».
Например:
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();
}
}
К сожалению, вы не можете обеспечить, чтобы у класса был правильный метод, но вы можете, по крайней мере, обеспечить выполнение во время компиляции того, что у получающегося метода фабрики есть все, что он ожидает (то есть метод инициализации с точно правильной сигнатурой). Это лучше, чем исключение отражения во время выполнения.
Этот подход также имеет некоторые преимущества, т.е. вы можете повторно использовать методы init, иметь их как методы экземпляра и т. Д.