Получить тип объекта во время выполнения - PullRequest
4 голосов
/ 17 августа 2011

У меня есть код ниже. Я получаю объект, тип которого я не знаю. Я должен проверить три условия, чтобы проверить его тип, а затем сделать правильный бросок.

Есть ли способ получить тип объекта во время выполнения и выполнить приведение, без проверки какого-либо условия?

У меня есть объект requirementTemplate, и мне нужно проверить его многими типами, чтобы получить его тип, а затем выполнить приведение.

if (requirementTemplate.GetType() == typeof(SRS_Requirement))
{
    ((SRS_Requirement)((TreeNodeInfo)ParentTreeNode.Tag).Handle).AssociatedFeature = ((SRS_Requirement)requirementTemplate).AssociatedFeature;
}
else if (requirementTemplate.GetType() == typeof(CRF_Requirement))
{
    ((CRF_Requirement)((TreeNodeInfo)ParentTreeNode.Tag).Handle).AssociatedFeature = customAttr.saveAttributesCustomList(AttributesCustomListCloned);
}
else if (requirementTemplate.GetType() == typeof(SAT_TestCase))
{
    ((SAT_TestCase)((TreeNodeInfo)ParentTreeNode.Tag).Handle).AssociatedFeature = ((SAT_TestCase)requirementTemplate).AssociatedFeature;
}

Ответы [ 2 ]

3 голосов
/ 17 августа 2011

Я думаю, вам нужно использовать ключевое слово as. Отметьте как (C # Reference)

2 голосов
/ 17 августа 2011

наиболее подходящим ответом здесь будет либо реализация общего интерфейса, либо переопределение виртуального метода из общего базового класса, и использование полиморфизма для предоставления реализации (из различных реализующих классов) во время выполнения. Тогда ваш метод становится:

(blah.Handle).AssociatedFeature  = requirementTemplate.GetAssociatedFeature();

Если список не является исключительным (то есть существуют другие реализации), то:

var feature = requirementTemplate as IHasAssociatedFeature;
if(feature != null) {
    (blah.Handle).AssociatedFeature = feature.GetAssociatedFeature();
}

вы можете делать аналогичные вещи и с левой стороны, или передавать это как контекст:

var feature = requirementTemplate as IHasAssociatedFeature;
if(feature != null) {
     feature.SetAssociatedFeature(blah);
}

(при необходимости)


Другой весьма распространенный подход - это switch на перечислении здесь:

switch(requirementTemplate.FeatureType) {
     case ...
}

одна приятная вещь в этом - то, что это может быть или специфичным для типа или экземпляром.

...