2009-07-27 2 views
2

Je veux travailler autour du fait que mon servicelayer WCF ne peut pas gérer une méthode générique comme ceci:C# coulée au type obtenu à partir typename sous forme de chaîne

public void SaveOrUpdateDomainObject<T>(T domainObject) 
{   
    domainRoot.SaveDomainObject<T>(domainObject); 
} 

donc je construit cette méthode de contournement à la place

public void SaveOrUpdateDomainObject(object domainObject, string typeName) 
{   
    Type T = Type.GetType(typeName); 
    var o = (typeof(T))domainObject; 
    domainRoot.SaveDomainObject<typeof(T)>(o); 
} 

Le problème est que cela ne compile pas en quelque sorte.

Je pense que cela est le résultat de ne pas me comprendre pleinement la différence entre

  • Type T Je crois que c'est un objet de type "Type"

  • le résultat de typeof (T) je crois que cela se traduit par une version de type non-objet du type de T (je ne sais pas comment dire exactement)

+0

'typeof' est une construction à la compilation. 'typeof (T)' dans votre cas est 'Type'. Vous mélangez des éléments de compilation et d'exécution. –

Répondre

7

Vous n'avez pas besoin de typeName: vous devez soit faire passer des instances Type, soit utiliser object.GetType() pour récupérer le type d'exécution d'objet.

Dans les deux cas,

MethodInfo genericSaveMethod = domainRoot.GetType().GetMethod("SaveDomainObject"); 
MethodInfo closedSaveMethod = genericSaveMethod .MakeGenericMethod(domainObject.GetType()); 
closedSaveMethod.Invoke(domainRoot, new object[] { domainObject }); 
0

Malheureusement, quelque chose comme cela est assez difficile en C#. Il est facile d'obtenir l'instance de type correcte à partir d'une chaîne, comme vous l'avez fait, mais vous devrez utiliser la réflexion pour obtenir la bonne méthode.

Essayez quelque chose le long des lignes de

public void SaveOrUpdateDomainObject(object domainObject, string typeName) 
{ 
    Type T = Type.GetType(typeName); 
    MethodInfo genericMethod = domainRoot.GetType().GetMethod("SaveDomainObject"); 
    MethodInfo method = genericMethod.MakeGenericMethod(T); 
    method.Invoke(domainRoot, new object[] { domainObject }); 
} 
+0

Mauvais! Cessez de donner des réponses incorrectes si vous n'essayez même pas de le compiler ... – leppie

+1

"Essayez quelque chose du genre de" devrait vous avoir donné un indice. La direction que j'ai donnée fonctionnera (c'est aussi ce qu'Anton Gogolev a proposé). Ce n'est tout simplement pas copier et coller prêt. – Ruben

+0

Cependant, juste pour les curieux, je l'ai modifié pour compiler. C'est toujours la même réponse qu'Anton. – Ruben

0

Je pense que j'ai eu un problème similaire, a cependant ce qui est un peu en désordre:

if (businessObject is Made4Print.Country) 
    ((Made4Print.Country)businessObject).Save(); 
else if (businessObject is Made4Print.User) 
    ((Made4Print.User)businessObject).Save(); 

... Les charges d'autres ...

else if (businessObject is Made4Print.Timezone) 
    ((Made4Print.Timezone)businessObject).Save(); 

Sera intéressé par une meilleure solution.

Questions connexes