 <p>I would personally use an interface as suggested, but in case you didn't have access to who is calling you (such as third party .dll) then you can accept an argument of type object:</p> <pre><code> /// &lt;summary&gt; /// Draw any type of object if the objec type is supported. /// Circles, Squares, etc. /// &lt;/summary&gt; /// &lt;param name="objectToDraw"&gt;&lt;/param&gt; public void Draw(object objectToDraw) { // get the type of object string type = objectToDraw.GetType().ToString(); switch(type) { case "Circle": // cast the objectToDraw as a Circle Circle circle = objectToDraw as Circle; // if the cast was successful if (circle != null) { // draw the circle circle.Draw(); } // required break; case "Square": // cast the object as a square Square square = objectToDraw as Square; // if the square exists if (square != null) { // draw the square square.Draw(); } // required break; default: // raise an error throw new Exception("Object Type Not Supported in Draw method"); } } </code></pre>