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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.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#_Asp.net_Design Patterns - Fatal编程技术网

C# 从工厂获取不同的返回类型对象

C# 从工厂获取不同的返回类型对象,c#,asp.net,design-patterns,C#,Asp.net,Design Patterns,我已经编写了以下代码来包含N1和N2 wcf服务引用。我试图编写某种工厂方法来获取代理对象的特定实例,这是在运行时确定的 我无法在业务代码中使用工厂分配的proxyType out变量,如下所示。你能告诉我我遗漏了什么信息吗 如果我目前的方法不正确,如何使用泛型实现这一点?或者该场景是否有任何既定的设计模式 namespace N1 { public class Proxy1 { public void foo() { //

我已经编写了以下代码来包含N1和N2 wcf服务引用。我试图编写某种工厂方法来获取代理对象的特定实例,这是在运行时确定的

我无法在业务代码中使用工厂分配的proxyType out变量,如下所示。你能告诉我我遗漏了什么信息吗

如果我目前的方法不正确,如何使用泛型实现这一点?或者该场景是否有任何既定的设计模式

namespace N1
{
    public class Proxy1
    {
        public void foo()
        {
            //do something 
        }
    }
}

namespace N2
{
    public class Proxy2
    {
        public void foo()
        {
            //do something 
        }
    }
}

namespace N3
{
    static class Helper
    {
        public static object getProxyInstance(int i, out Type t)
        {
            object objectToReturn = null;
            t = null;
            if (i == 1)
            {
                objectToReturn = new N1.Proxy1();
                t = typeof(N1.Proxy1);
            }
            else if (i == 2)
            {
                objectToReturn = new N2.Proxy2();
                t = typeof(N2.Proxy2);
            }
            return objectToReturn;
        }
    }
}

namespace N4
{
    class BusinessClass
    {
        public void bar()
        {
            Type proxyType;
            var proxyObj = (proxyType)N3.Helper.getProxyInstance(1, out proxyType);
        }
    }
}

var proxyObj = (**proxyType**)N3.Helper.getProxyInstance(1, out proxyType);

Type or namespace proxyType could not be found.
编辑:这里是挑战-
Proxy1和Proxy2是由Visual Studio的“添加服务引用”命令生成的类。如果我更新服务引用,我的代码更改将消失,每次我都必须重新编写代码。因此,试图在不包装这些代理类的情况下手动编写代码。

为什么不使用一个IProxy接口来实现它们呢。@YoryeNathan因为Proxy1和Proxy2是通过添加服务引用生成的类。如果我使用Visual Studio更新服务引用,我的代码更改将消失,每次我都必须重新编写代码。Visual Studio生成的类通常是局部的。因此,您可以通过创建两个新文件使两个类都实现一个接口,每个文件还将所讨论的类声明为部分类,并将它们都声明为接口的实现者。我想这就是VS生成分部类的原因。
public interface IProxy
{
    void Foo();
}

public class Proxy1 : IProxy
{
    public void Foo()
    {
    }
}

public class Proxy2 : IProxy
{
    public void Foo()
    {
    }
}

static class Helper
{
    public static IProxy GetProxyInstance(int i)
    {
        if (i == 1)
        {
            return new Proxy1();
        }
        else if (i == 2)
        {
            return new Proxy1();
        }
        else
        {
            return null;
        }
    }
}

class BusinessClass
{
    public void bar()
    {
        IProxy proxyObj = Helper.GetProxyInstance(1);
        proxyObj.Foo();
    }
}