c#casting to type from typename as string

时间:2009-07-27 09:48:19

标签: c# casting types typeof gettype

我想解决一下这样一个事实:我的WCF服务层无法处理这样的泛型方法:

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);
}

问题是这不能以某种方式编译。

我认为这是我没有完全理解

之间差异的结果
  • T型 我相信这是“Type”

  • 类型的对象
  • typeof(T)的结果 我相信这会导致T类型的非对象类型版本(我不知道该怎么说)

3 个答案:

答案 0 :(得分:7)

您不需要typeName:您必须传递Type个实例,或使用object.GetType()来检索对象运行时类型。

在任何一种情况下,

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

答案 1 :(得分: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 });
}

答案 2 :(得分: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();

对更好的解决方案感兴趣。