У меня есть код ниже:
public class Anything
{
public int Data { get; set;}
}
public class MyGenericBase<T>
{
public void InstanceMethod(T data)
{
// do some job
}
public static void StaticMethod(T data)
{
// do some job
}
// others members...
}
public sealed class UsefulController : MyGenericBase<Anything>
{
public void ProxyToStaticMethod()
{
StaticMethod(null);
}
// others non derived members...
}
public class Container
{
public UsefulController B { get; set; }
}
public class Demo
{
public static void Test()
{
var c = new Container();
c.B.InstanceMethod(null); // Works as expected.
c.B.StaticMethod(null); // Doesn't work.
// Static method call on object rather than type.
// How to get the static method on the base type ?
c.B.ProxyToStaticMethod(); // Works as expected.
}
}
Компилятор очень злится... Я понимаю сообщение об ошибке, но я не знаю, как это решить. Я пытался получить тип, а не объект для вызова моего статического метода, но я не нашел способ сделать это правильно. Более того, это приводит к чему-то не совсем элегантному.
В принципе, GenericBase - это класс из фреймворка с множеством статических методов и некоторых методов экземпляра. Контроллер печатает этот класс и расширяет его.
Контейнер представляет собой группу логически связанных контроллеров.
Интересная вещь: Java-версия этого кода компилируется правильно, но с предупреждением. Выполнение также является правильным.
Существует ли шаблон проектирования для решения этой проблемы?
Спасибо за ваши данные!
Я нашел способ избавиться от этой проблемы, благодаря вашим ответам. Кажется, что это работает, но я не могу сказать, есть ли побочные эффекты, которые правильно знают.
public class GenericBase<T> : MyGenericBase<T>
{
// Create instance calls here for every base static method.
}
public sealed class UsefulController : GenericBase<Anything>
{
// others non derived members...
}