2017-06-11 5 views
0

Je voudrais mettre en œuvre la méthode suivante:Création Proxy/Mock objet à partir de/de type générique

public static T CreateProxyObject<T>(Dictionary<String,Object> setup) 

les règles suivantes:

1) Je veux rester comme moyen générique que possible T n'est pas connu pendant la compilation et je veux être capable de le renvoyer à l'utilisateur comme le type demandé par proxy/proxy (l'utilisateur peut toujours utiliser intellisense normal pour obtenir les métadonnées de l'objet).

2) Il doit avoir toutes les propriétés sont définies/configuration basée sur le dictionnaire de configuration:

String-> property name of the object 

Object-> the return value for this property 

Toute autre méthode doit être mis en œuvre avec lançage pas exception mises en œuvre

je tentais d'utiliser la maquette de T (à partir du cadre Moq) mais T doit être le type de référence.

N'a pas eu de succès avec Castle DynamicProxy et RealProxy.

Une idée?

Répondre

0

Après avoir cherché un peu plus j'ai trouvé this réponse qui me laisse guider d'utiliser impromptu-interface qui utilise l'objet ExpandoObject/dynamique afin de mettre en œuvre une interface, et avec this réponse (qui résolvent le problème de la définition des propriétés dynamiquement),

j'ai pu créer la mise en œuvre suivante:

public static T CreateProxyObject<T>(Dictionary<String,Object> setup) where T : class 
{ 
    return setup.Aggregate(
      (IDictionary<string, object>) new ExpandoObject(), 
      (e, kvSetup) => 
       { 
        e.Add(kvSetup.Key, kvSetup.Value); 
        return e; 
       }).ActLike<T>(); 

} 

qui peut être utilisé comme ceci:

public interface IPerson 
{ 
    string Name { get; set; } 
    int Age { get; set; } 
    void Method(); 
} 



public class Program 
{ 
    static void Main(string[] args) 
    { 
     //Dynamic Expando object 
     var p = CreateProxyObject<IPerson>(new Dictionary<string, object> 
             { 
              {"Name", "a name"}, 
              {"Age", 13} 
             }); 
     var n = p.Name; 
     var a = p.Age; 
     //Throws: 'System.Dynamic.ExpandoObject' does not contain a definition for 'Method' 
     p.Method(); 
    } 
}