2010-03-12 8 views
2

J'expérimente le modèle d'objet dynamique C# 4.0.Héritage de la classe qui hérite de DynamicObject

J'ai créé une classe abstraite appelée "Bloc" qui hérite de DynamicObject. Il remplace TryGetMember et TrySetMember.

En outre, j'ai créé une classe utilisable nommée "Brush" qui hérite de "Block". Je veux qu'il soit utilisable dynamiquement. Mais quand je crée un objet dynamique à partir de celui-ci et que j'essaie d'accéder à un membre lié à l'exécution, il me raconte une exception m'indiquant que le membre n'existe pas. Les méthodes TryGetMember ou TrySetMember substituées de la classe parent abstraite ne sont pas appelées.

Ce comportement est-il normal?

Merci!

Répondre

1

Vous n'avez pas posté de code, c'est difficile à dire mais voici un exemple qui fonctionne vraiment. C'est une version modifiée de ce que je lisais aujourd'hui. J'espère que ça aide

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

Maintenant, je suis totalement confus. J'ai ajouté le Microsoft.CSharp.RuntimeBinder.RuntimeBinderException à la liste des exceptions connues par le débogueur (CTRL + D, E, il n'avait pas été dans la liste avant), a dit au débogueur de ne pas s'arrêter sur cette exception, et, evoila, maintenant ça marche. étrange ... –

Questions connexes