Groovy Like ConfigSlurper in C# using ExpandoObject

Posted: August 21, 2011 in C#
Tags: , , ,

In Groovy ConfigSlurper is a utility class that is used for reading configuration files written in form of Groovy scripts.Let’s consider the following properties file.

props

We will use a Groovy script to read from this properties file as shown in the snippet below:

package com.test

import java.util.Properties

class Start {

    static main(args) { 
        def p = new Properties() 
        new File("test.properties").withInputStream { 
          stream -> p.load(stream) 
        } 
        println "gfv3.admin.url=" + p["gfv3.admin.url"] 
  
    }

}


This is a very simple piece of code which makes use of the java.util.Properties class and load the properties file using java.io.File and it’s associated InputStream class.Here the properties are accessed as  a map of name/value pairs. This code can be tweaked bit using the ConfigSlurper class and the values can be accessed as object properties as shown below:

package com.test

import java.util.Properties

class Start {

    static main(args) { 
        def p = new Properties() 
        new File("test.properties").withInputStream { 
          stream -> p.load(stream) 
        } 
        def cfg = new ConfigSlurper().parse(p) 
        println "gfv3.admin.url=" + cfg.gfv3.admin.url 
    
    }

}

We can write a similar ConfigSlurper in C# using the System.Dynamic.ExpandoObject which allows us to add and remove properties to this object at runtime.ExpandoObject implement a IDictionary and IDynamicMetaObjectProvider interfaces as shown in the definition below:

public sealed class ExpandoObject : IDynamicMetaObjectProvider,IDictionary<string, Object>, ICollection<KeyValuePair<string, Object>>, IEnumerable<KeyValuePair<string, Object>>, IEnumerable, INotifyPropertyChanged

We can use the IDictionary implementation to attach properties at runtime as shown below in the ConfigSlurper class.

public static class ConfigSlurper 
{ 
    public static ExpandoObject  Parse(System.Collections.Specialized.NameValueCollection settings) 
    { 
        var config = new ExpandoObject(); 
        var dictConfig = (config as IDictionary<String, object>); 
        foreach (var k in settings.AllKeys) 
        { 
            dictConfig[k] = settings[k]; 
        } 
        return config; 
    } 
} 

The config settings are defined as shown below:

<appSettings> 
  <add key="gfv3AdminUrl" value="http\://localhost\:4848"/> 
  <add key="gfv3Root" value="D\:\\Program Files\\glassfish-3.0.1\\glassfish"/> 
  <add key="gfv3Port" value="4848"/> 
  <add key="gfv3Host" value="localhost"/> 
  <add key="gfv3Username" value="admin"/> 
  <add key="gfv3Url" value="http\://localhost\:8080"/> 
</appSettings> 

This config can be read using the ConfigSlurper class as:

static void Main(string[] args)
{
    dynamic config = ConfigSlurper.Parse(ConfigurationManager.AppSettings);
    Console.WriteLine(config.gfv3AdminUrl);
    Console.Read();
}
About these ads
Comments
  1. Groovy Like ConfigSlurper in C# using ExpandoObject « Sankarsan’s Journal…

    Thank you for submitting this cool story – Trackback from DotNetShoutout…

  2. [...] script to read from this properties file as shown in the snippet below: package com.test import… Read more… Categories: .NET     Share | Related [...]

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s