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