title: What is the name of this bad practice / anti-pattern?
body: <p>I'm trying to explain to my team why this is bad practice, and am looking for an anti-pattern reference to help in my explanation.  This is a very large enterprise app, so here's a simple example to illustrate what was implemented: </p>
  
  <pre><code>public void ControlStuff()
      {
          var listOfThings = LoadThings();
          var listOfThingsThatSupportX = new string[] {"ThingA","ThingB", "ThingC"};
          foreach (var thing in listOfThings)
          {
              if(listOfThingsThatSupportX.Contains(thing.Name))
              {
                  DoSomething();
              }
          }
      }
  </code></pre>
  
  <p>I'm suggesting that we add a property to the 'Things' base class to tell us if it supports X, since the Thing subclass will need to implement the functionality in question.  Something like this: </p>
  
  <pre><code>public void ControlStuff()
      {
          var listOfThings = LoadThings();
          foreach (var thing in listOfThings)
          {
              if (thing.SupportsX)
              {
                  DoSomething();
              }
          }
      }
  class ThingBase
  {
      public virtual bool SupportsX { get { return false; } }
  }
  class ThingA : ThingBase
  {
      public override bool SupportsX { get { return true; } }
  }
  class ThingB : ThingBase
  {
  }
  </code></pre>
  
  <p>So, it's pretty obvious why the first approach is bad practice, but what's this called?  Also, is there a pattern better suited to this problem than the one I'm suggesting?  </p>