Following code shows how to create a dimension for a selected curve based element:

namespace myRevitApp
{
   [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
   [Autodesk.Revit.Attributes.Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Manual)]
   public class TestCommand : IExternalCommand
   {
      public Result Execute(ExternalCommandData commandData, ref string message, Autodesk.Revit.DB.ElementSet elements)
      {
         UIDocument uiDoc = commandData.Application.ActiveUIDocument;
         Application app = commandData.Application.Application;
         Document doc = uiDoc.Document;
         View view = doc.ActiveView;
         ViewType vt = view.ViewType;

         if (vt == ViewType.FloorPlan || vt == ViewType.Elevation)
         {
            Reference eRef = uiDoc.Selection.PickObject(ObjectType.Element, “Please pick a curve based element like wall.”);
            if (eRef != null && eRef.Element != null)
            {
               XYZ dirVec = new XYZ();
               XYZ viewNormal = view.ViewDirection;

               LocationCurve locCurve = eRef.Element.Location as LocationCurve;
               if (locCurve == null || locCurve.Curve == null)
               {
                  TaskDialog.Show(“Prompt”, “Selected element isn’t curve based!”);
                  return Result.Cancelled;
               }

               // location curve needs to be perpendicular to view normal
               XYZ dirCur = locCurve.Curve.get_EndPoint(0).Subtract(locCurve.Curve.get_EndPoint(1)).Normalize();
               double d = dirCur.DotProduct(viewNormal);
               if (d > -0.000000001 && d < 0.000000001)
               {
                  dirVec = dirCur.CrossProduct(viewNormal);
                  XYZ p1 = locCurve.Curve.get_EndPoint(0);
                  XYZ p2 = locCurve.Curve.get_EndPoint(1);
                  XYZ dirLine = XYZ.Zero.Add(p1);
                  XYZ newVec = XYZ.Zero.Add(dirVec);
                  newVec = newVec.Normalize().Multiply(3);
                  dirLine = dirLine.Subtract(p2);

                  p1 = p1.Add(newVec);
                  p2 = p2.Add(newVec);
                  // move the dimension line a little away the element’s curve
                  Line newLine = app.Create.NewLine(p1, p2, true);

                  ReferenceArray arrRefs = new ReferenceArray();
                  Options options = app.Create.NewGeometryOptions();
                  options.ComputeReferences = true;
                  options.DetailLevel = DetailLevels.Fine;
                  GeometryElement element = eRef.Element.get_Geometry(options);
                  GeometryObjectArray geoObjectArray = element.Objects;
                  //enum the geometry element
                  for (int j = 0; j < geoObjectArray.Size; j++)
                  {
                     GeometryObject geoObject = geoObjectArray.get_Item(j);
                     Solid solid = geoObject as Solid;
                     if (solid == null)
                        continue;

                     FaceArrayIterator fIt = solid.Faces.ForwardIterator();
                     while (fIt.MoveNext())
                     {
                        PlanarFace p = fIt.Current as PlanarFace;
                        if (p == null)
                           continue;

                        p2 = p.Normal.CrossProduct(dirLine);
                        if (p2.IsZeroLength())
                        {
                           arrRefs.Append(p.Reference);
                        }
                        if (2 == arrRefs.Size)
                        {
                           break;
                        }
                     }
                     if (2 == arrRefs.Size)
                     {
                        break;
                     }
                  }
                  if (arrRefs.Size != 2)
                  {
                     TaskDialog.Show(“Prompt”, “Couldn’t find enough reference for creating dimension”);
                     return Result.Cancelled;
                  }

                  Transaction trans = new Transaction(doc, “create dimension”);
                  trans.Start();
                  doc.Create.NewDimension(doc.ActiveView, newLine, arrRefs);
                  trans.Commit();
               }
               else
               {
                  TaskDialog.Show(“Prompt”, “Selected element isn’t curve based!”);
                  return Result.Cancelled;
               }
            }
         }
         else
         {
            TaskDialog.Show(“Prompt”, “Only support Plan View or Elevation View”);
         }

         return Result.Succeeded;
      }
   }
}