【问题标题】:Inheriting from class that inherits from DynamicObject从继承自 DynamicObject 的类继承
【发布时间】:2023-03-27 01:36:01
【问题描述】:

我正在试验 C# 4.0 的动态对象模型。

我创建了一个名为“Block”的抽象类,它继承自 DynamicObject。它覆盖 TryGetMember 和 TrySetMember。

此外,我创建了一个名为“Brush”的可用类,它继承自“Block”。我希望它可以动态使用。

但是当我从它创建一个动态对象并尝试访问一个运行时绑定的成员时,它向我抛出一个异常,告诉我该成员不存在。抽象父类的重写 TryGetMember 或 TrySetMember 方法没有被调用。

这种行为是意料之中的吗?

谢谢!

【问题讨论】:

    标签: inheritance dynamic c#-4.0 dynamicobject


    【解决方案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;
            }
    
        }
    
    
    }
    

    【讨论】:

    • 现在我完全糊涂了。我已将 Microsoft.CSharp.RuntimeBinder.RuntimeBinderException 添加到调试器已知的异常列表中(CTRL+D,E;它以前不在列表中),告诉调试器不要停止此异常,并且, e'voila,现在它可以工作了。奇怪...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多