我想解决一下这样一个事实:我的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类型的非对象类型版本(我不知道该怎么说)
答案 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();
对更好的解决方案感兴趣。