ОК, так что я смотрю на некоторый код, который выглядит примерно так:Глядя на дизайн шаблона, чтобы заменить huuuge если на объекте Тип
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);
Это проблема по сравнению с общей версией, что вы не смогли бы добавлять новые типы во время выполнения. Ts есть что-то хитрое, которое можно сделать с контейнером DI в GetPropsGeneric для разрешения контейнера? Благодаря!
Вы можете реализовать оболочку вокруг любого класса, который вы не можете изменить, и реализовать его интерфейс. Затем обрабатывайте только те объекты, которые были обернуты. Я делаю это с помощью DataContext, например, чтобы упростить модульный тест. – tvanfosson 2008-11-20 18:00:30