Question

J'expérimente avec le modèle objet dynamique C # 4.0.

J'ai créé une classe abstraite nommée « Block » qui hérite de DynamicObject. Elle remplace TryGetMember et TrySetMember.

De plus, je l'ai créé une classe utilisable nommée « brosse » qui hérite de « Block ». Je veux qu'il soit utilisable dynamiquement.

Mais quand je crée un objet dynamique de celui-ci et essayer d'accéder à un membre lié à l'exécution, il me à l'exception des peaux me disant que le membre n'existe pas. Les TryGetMember redéfinis par TrySetMember de la classe parente abstrait sont pas appelé.

est-ce comportement à attendre?

Merci!

Était-ce utile?

La solution

Vous avez pas posté de code est donc difficile de dire, mais voici un exemple qui fonctionne vraiment. Il est une version modifiée de choses que je lisais aujourd'hui. Hope it helps

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;
        }

    }


}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top