2010-03-12 169 views
2

我正在试验C#4.0的动态对象模型。继承自继承自DynamicObject的类

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

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

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

这是行为吗?

谢谢!

回答

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;它之前未列入列表中),告诉调试程序不要停止此异常,和e'voila,现在它工作。 怪异... – 2010-03-12 22:39:39