1

Is there an easy way to create a class method for a subclass of a DyanamicObject or ExpandoObject?

Is resorting back to reflection the only way?

What I mean is something like :-

class Animal : DynamicObject {
}

class Bird : Animal {
}

class Dog : Animal {
}

Bird.Fly = new Action (()=>Console.Write("Yes I can"));

Bird.Fly in this case applying to the class of Bird rather than any specific instance.

mfc
  • 3,018
  • 5
  • 31
  • 43
  • It's not clear what you are trying to achieve. Please try to rephrase your question. I don't see how a method in a subclass and reflection are related. – Daniel Hilgarth Aug 21 '12 at 14:24
  • 1
    `ExpandoObject` is sealed, anyway... – phipsgabler Aug 21 '12 at 14:24
  • 1
    Your question is very unclear. What do you mean on "class method"? Can you provide an example with some sample code? – nemesv Aug 21 '12 at 14:24
  • 1
    Ok, they're called static methods usually. You'll probably be able to expand [this](http://blogs.msdn.com/b/davidebb/archive/2009/10/23/using-c-dynamic-to-call-static-members.aspx). – phipsgabler Aug 21 '12 at 14:38

2 Answers2

2

Nope, there are no dynamic class scoped methods. The closest thing you could do is have a dynamic singleton statically declared on the subclass.

class Bird : Animal {
    public static readonly dynamic Shared = new ExpandoObject();


}

Bird.Shared.Fly = new Action (()=>Console.Write("Yes I can"));
jbtule
  • 31,383
  • 12
  • 95
  • 128
1
 public class Animal : DynamicObject
    {
        Dictionary<string, object> dictionary = new Dictionary<string, object>();

        public override bool TryGetMember(
        GetMemberBinder binder, out object result)
        {
            string name = binder.Name.ToLower();
            return dictionary.TryGetValue(name, out result);
        }

        public override bool TrySetMember(SetMemberBinder binder, object value)
        {
            dictionary[binder.Name.ToLower()] = value;
            return true;
        }
    }
    public class Bird : Animal
    {

    }

And then call it as your example:

dynamic obj = new Bird();
            obj.Fly = new Action(() => Console.Write("Yes I can"));

            obj.Fly();

For more info check DynamicObject

paulik
  • 119
  • 2