使用相同的方法从不同的命名空间实例化相同的对象

时间:2013-11-11 09:32:30

标签: c# object reflection

我正在使用一个糟糕的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吗?但我不知道该怎么做,我不知道是否有更好的解决方案。

3 个答案:

答案 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来解决这个问题仍然糟透了,但这是另一种选择,并且使用对象提升了一步