Pregunta

Estoy experimentando con el modelo de objeto dinámico de C # 4.0.

He creado una clase abstracta llamada "bloque" que hereda de DynamicObject. Se anula TryGetMember y TrySetMember.

Además he creado una clase utilizable llamado "cepillo" que hereda de "bloque". Yo quiero que sea utilizable de forma dinámica.

Sin embargo, cuando se crea un objeto dinámico de ella y tratar de acceder a un miembro con destino en tiempo de ejecución, me Pellejo con una excepción que me dice que el miembro no existe. Los métodos TryGetMember o anulados TrySetMember de la clase padre abstracta no están siendo llamados.

Es de esperar este comportamiento?

Gracias!

¿Fue útil?

Solución

No ha publicado ningún código por lo que es difícil de decir, pero aquí es una muestra que funciona definitivamente. Es una versión modificada de cosas que estaba leyendo en la actualidad. Espero que ayude

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

    }


}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top