Frage

Ich experimentiere mit dem dynamischen Objektmodell von C# 4.0.

Ich habe eine abstrakte Klasse mit dem Namen "Block" erstellt, die von DynamicObject erbt. Es überschreibt TryGetMember und TrysetMember.

Außerdem habe ich eine verwendbare Klasse namens "Pinsel" erstellt, die von "Block" erbt. Ich möchte, dass es dynamisch nutzbar ist.

Wenn ich jedoch ein dynamisches Objekt daraus erstelle und versuche, auf ein rundumgebundenes Mitglied zuzugreifen, fällt es mir mit einer Ausnahme, die mir sagt, dass das Mitglied nicht existiert. Die überschriebenen TryGetMember- oder TrysetMember -Methoden der abstrakten Elternklasse werden nicht aufgerufen.

Ist dieses Verhalten zu erwarten?

Vielen Dank!

War es hilfreich?

Lösung

Sie haben keinen Code gepostet, also ist es schwer zu sagen, aber hier ist ein Beispiel, das definitiv funktioniert. Es ist eine modifizierte Version von Sachen, die ich heute gelesen habe. Ich hoffe es hilft

namespace DynamicStuff
{
    public class Program
    {
        static void Main(string[] args)
        {
            dynamic brush = new Brush();
            brush.Handle = "Wooden";
            brush.Colour = "Red";

            Console.WriteLine(brush.Handle + " " + brush.Colour);
            Console.WriteLine(
                "Number of dynamic properties:" + brush.Count);

        }
    }

    public class Brush : Block
    {
        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            Console.Out.WriteLine("About To call TryGetMember base");
            object res = null;
            bool retVal = base.TryGetMember(binder, out res);
            result = res;
            return retVal;
        }

        public override bool TrySetMember(System.Dynamic.SetMemberBinder binder, object value)
        {
            Console.Out.WriteLine("About to call TrySetMember base");
            return base.TrySetMember(binder, value);
        }
    }

    public abstract class Block : DynamicObject
    {
        private Dictionary<string, object> d = new Dictionary<string, object>();

        public int Count
        {
            get
            {
                return d.Count;
            }
        }


        public override bool TryGetMember(
            GetMemberBinder binder, out object result)
        {
            Console.Out.WriteLine("In TryGetMember in block");
            string name = binder.Name.ToLower();
            return d.TryGetValue(name, out result);
        }

        public override bool TrySetMember(
            SetMemberBinder binder, object value)
        {
            Console.Out.WriteLine("In TrySetMember in block");
            d[binder.Name.ToLower()] = value;
            return true;
        }

    }


}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top