Наследование от класса, который наследуется от DynamicObject

StackOverflow https://stackoverflow.com/questions/2433806

Вопрос

Я экспериментирую с динамической объектной моделью C# 4.0.

Я создал абстрактный класс с именем «Блок», который наследуется от DynamicObject.Он переопределяет TryGetMember и TrySetMember.

Кроме того, я создал полезный класс под названием «Кисть», который наследуется от «Блока».Я хочу, чтобы его можно было использовать динамически.

Но когда я создаю из него динамический объект и пытаюсь получить доступ к члену, привязанному к среде выполнения, он выдает мне исключение, сообщающее, что этот член не существует.Переопределенные методы TryGetMember или TrySetMember абстрактного родительского класса не вызываются.

Стоит ли ожидать такого поведения?

Спасибо!

Это было полезно?

Решение

Вы не опубликовали никакого кода, поэтому сложно сказать, но вот образец, который определенно работает.Это модифицированная версия того, что я читал сегодня.Надеюсь, поможет

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

    }


}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top