C# 使用相同的方法实例化来自不同名称空间的相同对象
我使用的SOAP API存在一些问题:在不同的名称空间中有一组名为a、B和C的服务。要建立连接并使用API,我需要在密码中使用一个身份验证对象,我们将其称为AutObj。这个AutObj对于B和C是相同的,但是我不能使用相同的AutObj,因为每个名称空间都有它们的类型。所以现在我在做这个:C# 使用相同的方法实例化来自不同名称空间的相同对象,c#,object,reflection,C#,Object,Reflection,我使用的SOAP API存在一些问题:在不同的名称空间中有一组名为a、B和C的服务。要建立连接并使用API,我需要在密码中使用一个身份验证对象,我们将其称为AutObj。这个AutObj对于B和C是相同的,但是我不能使用相同的AutObj,因为每个名称空间都有它们的类型。所以现在我在做这个: class FactoryAut { public A.AutObj GetAutA (string pw) A.AutObj AutObj = new A.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;
}
在这里我传递给方法我需要什么类型的对象。我想我必须使用反射,对吗?但我不知道如何做到这一点,也不知道是否有更好的解决方案。首先,值得一看您的工具是否允许重复使用类型。例如,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 {}
}
这些部分声明与生成的文件(通常是.designer.cs
)中的代码组合在一起,并将使用隐式接口实现来满足IAutObj
最后,您可以拥有:
public T GetAut<T>(string pw) where T : class, new(), IAutObj
{
var obj = new T();
obj.pw = pw;
return obj;
}
我使用反射解决了这个问题:
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;
}
公共静态类工厂
{
公共静态T GetAut()
{
T autPar=Activator.CreateInstance();
System.Reflection.FieldInfo[]fi=typeof(T).GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic);
foreach(fi中的var字段)
{
开关(字段名称)
{
案例“pwField”:
字段设置值(autPar,ConfigurationService.pw);
打破
}
}
返回autPar;
}
如果其他人有此问题,我将与大家分享。我们有相同的情况,相同的对象在不同的命名空间中,由不同的WSDL生成
我们使用dynamic
解决了这个问题,这是不完美的,但它是另一种选择,是对使用object的改进
IAutObj autObj = GetAut<A>("abc");
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;
}