2013-05-16 2 views
1

Я пытаюсь улучшить часть кода, который я написал, но мне нужна ваша помощь.Как создать список классов в C#

В принципе, у меня есть 2 классов TypeARecommendationForm и TypeBRecommendationForm, наследуемые от GenericRecommendationForm, и я пытаюсь скопировать объект oRecommendation в новом объекте.

Для этого я проверяю тип, чтобы узнать, какой класс использовать.

Проблема в том, что иногда я создаю новые классы, которые наследуют от GenericRecommendationForm, и мне нужно пройти через все коды, чтобы увидеть, где добавить эти операторы if, поскольку у меня есть их в нескольких местах.

Что бы я хотел, это иметь список классов, чтобы при добавлении новых классов мне просто нужно было добавить его в список.

Кто-нибудь знает, как это сделать?

Вот код:

GenericRecommendationForm oRecommendation= new GenericRecommendationForm(); 
... 
if (oRecommendation.GetType() == typeof(TypeARecommendationForm)) 
{ 
    recommendationForm = new TypeARecommendationForm((TypeARecommendationForm)oRecommendation); 
} 
if (oRecommendation.GetType() == typeof(TypeBRecommendationForm)) 
{ 
    recommendationForm = new TypeBRecommendationForm((TypeBRecommendationForm)oRecommendation); 
} 
else if (oRecommendation.GetType() == typeof(GenericRecommendationForm)) 
{ 
    recommendationForm = new GenericRecommendationForm(oRecommendation); 
} 

Заранее спасибо за вашу помощь.

+1

Создание списка типа '' List

+1

Строка 'GenericRecommendationForm oRecommendation = новый GenericRecommendationForm();' всегда будет приводить к выполнению последнего 'else if'. Я предполагаю, что строка предназначена только для иллюстрации и не существует в вашем реальном коде? –

+1

http://dictionary.reference.com/browse/inherit – theyetiman

ответ

4

Самый простой способ добиться этого - дать вашему GenericRecommendationForm виртуальный метод Clone, который все производные формы переопределяют.

public class GenericRecommendationForm 
{ 
    // ... 

    public virtual GenericRecommendationForm Clone() 
    { 
     return new GenericRecommendationForm(this); 
    } 
} 

public class TypeARecommendationForm 
{ 
    // ... 

    public override GenericRecommendationForm Clone() 
    { 
     return new TypeARecommendationForm(this); 
    } 
} 

public class TypeBRecommendationForm 
{ 
    // ... 

    public override GenericRecommendationForm Clone() 
    { 
     return new TypeBRecommendationForm(this); 
    } 
} 
+0

Большое спасибо за вашу помощь. он отлично работал! – diditexas

2

Вы можете использовать List<Type> для хранения классов (а типы ваших классов фактически).

, когда вам нужно добавить еще один класс, просто используйте:

List<Type> _classes = new List<Type>(); 
_classes.Add(typeof(YourClass)); 

Затем, когда вы проверяете тип своего класса:

foreach(Type t in _classes) 
{ 
    if (oRecommendation.GetType() == t) 
     recommendationForm = Activator.CreateInstance(t, new object[] { oRecommendation }); 
} 

Но если бы я тебя, я хотел бы рассмотреть реализуя его по-другому.

Поскольку вы, похоже, фактически клонируете экземпляр вашего базового класса, просто добавьте в свой базовый класс виртуальный (или абстрактный) метод Clone, а затем добавьте необходимое поведение в производные классы.

Таким образом, вы не должны проверить типов на всех, и просто сделать:

oRecommendation.Clone() 
+0

Вы были правы, виртуальный клон() работал отлично. Спасибо за вашу помощь. – diditexas

+0

приветствую;), поскольку ответ Даниила более полно о методе «Клон», вы должны отметить его ответ как принятый – ppetrov

Смежные вопросы