Try our conversational search powered by Generative AI!

Anders Hattestad
Jan 26, 2011
(0 votes)

Just for fun

Deane Barker (@gadgetopia) tweeted about some code he had done just for fun to extend the PropertyDataGet handler. The concept is cool, and you should take a look @ 

But the problem is of course that its not strong typed, so we have problems with magic strings. But sometimes you can live with that, and Deane code is a nice extension if you can find a use :)

You can extend properties with extension methods. Those will be strong typed from the backend code. So I made myself a method that found every extension methods that worked on PropertyData or PageData and returned PropertyData or string that exists in the dll’s and makes them available for use thou the PropertyDataCollection.GetHandler.

The trick Deane used to exclude assembly's that started with System work great.

Code Snippet
  1. public static void Initialize(int optionFlags)
  2. {
  3.     extendProperties = new Hashtable();
  4.     extendPageData = new Hashtable();
  5.     HelpText = new StringBuilder();
  6.     AddText(HelpText, "<ul>");
  7.     foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
  8.     {
  9.         // This cuts the number of assemblies to be iterated by about 75%.  If your assembly starts with "System" for some reason (really bad idea, for the record), you need to remove this.
  10.         if (assembly.FullName.StartsWith("System"))
  11.             continue;
  12.         foreach (Type type in assembly.GetTypes())
  13.         {
  14.             foreach (MethodInfo method in type.GetMethods())
  15.             {
  16.                 bool isExtension = method.IsDefined(typeof(ExtensionAttribute), true);
  17.                 if (isExtension)
  18.                 {
  19.                     var parameters = method.GetParameters();
  20.                     Add<PropertyData, PropertyData>("PropertyData [PropertyData]:", HelpText, method, parameters, extendProperties);
  21.                     Add<PropertyData, string>("string [PropertyData]:", HelpText, method, parameters, extendProperties);
  22.                     Add<PageData, PropertyData>("PropertyData [PageData]:", HelpText, method, parameters, extendPageData);
  23.                     Add<PageData, string>("string [PageData]:", HelpText, method, parameters, extendPageData);
  24.                 }
  25.             }
  26.         }
  27.     }
  28.     AddText(HelpText, "</ul>");
  29.     PropertyDataCollection.GetHandler = DiscoverExtensionMethods.GetProperty;
  30. }
for instance this extension methods
Code Snippet
  1. public static string TimeAgo(this PropertyData prop)
  2. {
  3.     TimeSpan dif = DateTime.Now - ((DateTime)prop.Value);
  4.     if (dif.Days > 0)
  5.         return string.Format("{0} day{1} ago ", dif.Days, dif.Days == 1 ? "" : "s");
  6.     else if (dif.Hours > 0)
  7.         return string.Format("{0} hour{1} ago ", dif.Hours, dif.Hours == 1 ? "" : "s");
  8.     else if (dif.Minutes > 0)
  9.         return string.Format("{0} minute{1} ago ", dif.Minutes, dif.Minutes == 1 ? "" : "s");
  10.     return string.Format("{0} second{1} ago ", dif.Seconds, dif.Seconds == 1 ? "" : "s");
  11. }

can be used with PageCreated like this

Code Snippet
  1. CurrentPage.Property["PageCreated"].TimeAgo();


Code Snippet
  1. PageCreated=<EPiServer:Property ID="PageCreated" PropertyName="PageCreated:TimeAgo" EnableViewState="false" runat="server" />

and will result in code like this


The extension method that exists in the demo template


can also be used like this

Code Snippet
  1. GetPreviewText=<EPiServer:Property ID="Property2" PropertyName="GetPreviewText(100)" EnableViewState="false" runat="server" />

and will render like this


I even made myself a help function, so if you use propertyname !help! you will get an overview of methods that exists

Code Snippet
  1. Help=<EPiServer:Property ID="Property1" PropertyName="!help!" EnableViewState="false" runat="server" />



Code is available in the code section

and any ideas where this can be used would be appreciated :)

Jan 26, 2011


Please login to comment.
Latest blogs
Join the Content Recommendations Work Smarter webinar May 8th 16.00-16.45 CET with expert Aidan Swain

Learn more about Content Recommendations, with Optimizely’s very own Senior Solutions consultant, Aidan Swain . He will discuss best practices and...

Karen McDougall | Apr 12, 2024

Plugin for Identifying and Bulk Deleting Orphaned Missing Properties in Optimizely

I am aware that the Optimizely World community has extensively discussed this topic, with numerous solutions and code snippets available to help...

Adnan Zameer | Apr 11, 2024 | Syndicated blog

Enhancing the Authoring Experience: Extending the LinkItem

The LinkItem field is one of the most demanded properties by the community, allowing editors to effortlessly create and manage links across pages a...

Santiago Morla | Apr 10, 2024 | Syndicated blog

The distinctions between Optimizely Web Experimentation and Optimizely Feature Experimentation

This blog is part of the series - Unlocking the Power of Experimentation: A Marketer's Insight. Let’s dive into Optimizely's powerful experimentati...

Holly Quilter | Apr 9, 2024