2009-07-27 2 views
2

Я хочу работать с тем фактом, что мой WCF servicelayer не может обрабатывать общий метод, как это:с # отливкой типовой получила от TypeName, как струна

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

так что я построил этот метод обходного пути вместо

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

Проблема в том, что это не компилируется.

Я думаю, что это результат меня полностью не понимая разницу между

  • типа Т Я считаю, что это объект типа «типа»

  • результат TYPEOF (T) Я считаю, что это приводит к типу версии без объекта типа Т (я не знаю, как сказать это точно)

+0

'typeof' - это конструкция времени компиляции. 'typeof (T)' в вашем случае - 'Type'. Вы смешиваете время компиляции и время выполнения. –

ответ

7

Вам не нужно typeName: вам нужно либо пройти около Type экземпляров, либо использовать object.GetType() для извлечения типа времени выполнения объекта.

В любом случае,

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

К сожалению, что-то вроде этого довольно трудно в C#. Легко получить правильный экземпляр Type из строки, как и вы, но вам нужно использовать отражение, чтобы получить правильный метод.

попробовать что-то вдоль линий

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

Неверно! Прекратите давать неправильные ответы, если вы даже не пытаетесь его скомпилировать ... – leppie

+1

«Попробуйте что-то в строках», должно было дать вам подсказку. Направление, которое я дал, будет работать (это то, что и предложил Антон Гоголев). Это просто не копировать и вставлять готово. – Ruben

+0

Однако, только для любопытных, я изменил его для компиляции. Это все тот же ответ, что и у Антона. – Ruben

0

я думаю, что у меня была аналогичная проблема, однако сделал это который немного грязный:

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

... Нагрузки других ...

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

Будет интересным решением.