Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用相同的方法实例化来自不同名称空间的相同对象_C#_Object_Reflection - Fatal编程技术网

C# 使用相同的方法实例化来自不同名称空间的相同对象

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();

我使用的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();
    
    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;
    }