从继承自DynamicObject的类继承

3
我正在尝试使用C# 4.0的动态对象模型。我创建了一个名为"Block"的抽象类,它继承自DynamicObject,并重写了TryGetMember和TrySetMember方法。
此外,我还创建了一个可用的类"Brush",它继承自"Block"。我希望它能够以动态方式使用。
但是当我从中创建一个动态对象并尝试访问运行时绑定的成员时,它会抛出一个异常,告诉我该成员不存在。抽象父类中重写的TryGetMember或TrySetMember方法没有被调用。
这种行为是否可以预期?
谢谢!
1个回答

1

你还没有发布任何代码,所以很难说,但这里有一个肯定有效的示例。它是我今天阅读的内容的修改版。希望能帮到你。

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

    }


}

1
现在我完全困惑了。我已经将Microsoft.CSharp.RuntimeBinder.RuntimeBinderException添加到调试器已知的异常列表中(CTRL+D,E;之前它不在列表中),告诉调试器不要停止在这个异常上,然后,哎呀,现在它可以工作了。奇怪... - Hendrik Wiese

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接