1

我正在使用有问题的 SOAP API:在不同的命名空间中有一堆服务,称为 A、B 和 C。要建立连接并使用 API,我需要使用带有密码的身份验证对象,我们称之为 AutObj . 这个 AutObj 对于 AB 和 C 是相同的,但我不能使用同一个,因为每个命名空间都有它们的类型。所以现在我正在这样做:

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

我在哪里将我需要的对象类型传递给方法。我想我必须使用反射对吗?但是我不知道该怎么做,也不知道是否有更好的解决方案。

4

3 回答 3

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.

最后,您可以拥有:

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");
于 2013-11-11T09:38:45.440 回答
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;
    }
于 2013-11-21T11:50:27.440 回答
0

如果其他人遇到这个问题,我会分享。我们有同样的情况,不同的 wsdls 生成不同命名空间中的相同对象。

我们使用dynamic不完美的方法解决了它,但它是另一种选择,并且是使用对象的一步。

于 2014-12-11T05:23:25.763 回答