ОК, поэтому я ищу код, который выглядит примерно так:
void DoSomething(object o)
{
if (o is Sometype1) {
//cast o to Sometype and do something to it
}
else if (o is Sometype2) {
//cast o to Sometype2 and do something to it
}
...
else if (o is SometypeN) {
//cast o to SometypeN and do something to it
}
}
Теперь один из подходов состоит в том, чтобы все объекты o
, используемые в качестве параметров, реализовывали интерфейс, подобный
interface ICanHaveSomethingDoneToMe
{
//expose various properties that the DoSomething method wants to access
}
Но проблема в том, что я не хочу, чтобы все мои объекты реализовывали этот интерфейс - логика для метода что-то на самом деле не принадлежит им. Какой шаблон я должен использовать, чтобы справиться с этим?
Я подозреваю, что-то вроде серии реализаций
interface IPropertiesForDoingSomethingTo<T>
{
//expose various properties that the DoSomething method wants to access
}
может быть лучше. У меня была бы реализация для каждого из типов объектов, с которыми я хочу это сделать, но тогда у меня возникла новая проблема. В данный момент мне нужен такой метод, как
IPropertiesForDoingSomethingTo<T> GetPropsGeneric(T t);
но нужно ли для этого иметь огромный переключатель? Должен ли я определить класс с множеством методов, таких как
IPropertiesForDoingSomethingTo<Someobject1> GetProps(Someobject1 t);
...
IPropertiesForDoingSomethingTo<Someobject1> GetProps(SomeobjectN t);
По сравнению с общей версией проблема заключается в том, что вы не сможете добавлять новые типы во время выполнения. Есть ли что-то хитрое, что можно сделать с DI-контейнером в GetPropsGeneric для разрешения контейнера? Спасибо!