Skip to content

Instantly share code, notes, and snippets.

@kcuzner
Created December 29, 2014 17:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kcuzner/3670e78ae1707a0e959d to your computer and use it in GitHub Desktop.
Save kcuzner/3670e78ae1707a0e959d to your computer and use it in GitHub Desktop.
ExpandoObject-esque DynamicObject ToString overriding
using System;
using System.Linq;
using System.Dynamic;
using System.Collections.Generic;
namespace Expando
{
public delegate string ToStringFunc();
class ToStringExpandoObject : DynamicObject
{
public IDictionary<string, object> Members { get; private set; }
public ToStringExpandoObject()
{
this.Members = new Dictionary<string, object>();
}
public override bool TryDeleteMember(DeleteMemberBinder binder)
{
return this.Members.Remove(binder.Name);
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
return this.Members.TryGetValue(binder.Name, out result);
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
this.Members[binder.Name] = value;
return true;
}
public override string ToString()
{
//see if we defined a ToString member
//if not, use the base implementation
object methodObj;
this.Members.TryGetValue("ToString", out methodObj);
ToStringFunc method = methodObj as ToStringFunc;
if (method == null)
return base.ToString();
return method();
}
}
class MainClass
{
public static void Main(string[] args)
{
dynamic test = new ToStringExpandoObject();
test.ToString = new ToStringFunc(() =>
{
return "Test";
});
test.Asdf = "asdf";
Console.WriteLine(test);
Console.WriteLine(test.ToString());
Console.WriteLine(test.Asdf);
test = new ToStringExpandoObject();
Console.WriteLine(test);
Console.WriteLine(test.ToString());
}
}
}
@dandraka
Copy link

A big thank you for that :-) I used it in my open source XmlSlurper (https://github.com/dandraka/XmlUtilities/) and it was a life saver :-)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment