我正在使用一个糟糕的SOAP API:在不同的名称空间中有一堆服务,称为A,B和C.要建立连接并使用API我需要使用我的密码的身份验证对象,让我们称之为AutObj。对于A B和C,此AutObj是相同的,但我不能使用相同的,因为每个名称空间都有它们的类型。所以现在我正在这样做:
class FactoryAut {
public A.AutObj GetAutA (string pw)
A.AutObj AutObj = new A.AutObj();
AutObj.pw = pw;
return AutObj;
}
public B.AutObj GetAutB (string pw)
B.AutObj AutObj = new B.AutObj();
AutObj.pw = pw;
return AutObj;
}
public C.AutObj GetAutC (string pw)
C.AutObj AutObj = new C.AutObj();
AutObj.pw = pw;
return AutObj;
}
我正在考虑实施这样的事情:
public T GetAut (string pw, T)
T.AutObj AutObj = new T.AutObj();
AutObj.pw = pw;
return AutObj;
}
我向该方法传递了我需要的对象类型。我想我必须使用Reflection吗?但我不知道该怎么做,我不知道是否有更好的解决方案。
答案 0 :(得分:2)
首先,值得一看的是您的工具是否允许重复使用类型。例如,WCF确实(不是我是世界上最伟大的WCF粉丝) - 这将使整个问题消失。
接下来我要看的是工具是否正在生成partial
类。如果是,您可以执行以下操作:
public interface IAutObj
{
string pw {get;set;}
}
namespace A
{
partial class AutObj : IAutObj {}
}
namespace B
{
partial class AutObj : IAutObj {}
}
namespace C
{
partial class AutObj : IAutObj {}
}
这些partial
声明与生成的文件中的代码(通常为.designer.cs
)相结合,并将使用隐式接口实现来满足IAutObj
。< / p>
最后,您可以:
public T GetAut<T>(string pw) where T : class, new(), IAutObj
{
var obj = new T();
obj.pw = pw;
return obj;
}
并使用:
var autObj = GetAut<A>("abc");
您甚至可以将下游代码限制为接口而不是T
,即
IAutObj autObj = GetAut<A>("abc");
答案 1 :(得分:0)
我用反射解决了这个问题:
public static class Factory
{
public static T GetAut<T>()
{
T autPar = Activator.CreateInstance<T>();
System.Reflection.FieldInfo[] fi = typeof(T).GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic);
foreach (var field in fi)
{
switch (field.Name)
{
case "pwField":
field.SetValue(autPar, ConfigurationService.pw);
break;
}
}
return autPar;
}
答案 2 :(得分:0)
我知道自从这个问题被提出已经有好几年了,但是如果其他人有这个问题,我会分享。我们有相同的情况,从不同的wsdls生成的不同命名空间中的相同对象。
我们使用dynamic
来解决这个问题仍然糟透了,但这是另一种选择,并且使用对象提升了一步