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

他の誰かがこの問題を抱えている場合は、共有します。同じ状況、異なる wsdl から生成された異なる名前空間の同じオブジェクトがあります。

これdynamicは不完全ですが、別のオプションであり、オブジェクトの使用からのステップアップです。

于 2014-12-11T05:23:25.763 に答える
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 に答える