Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.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#_Factory - Fatal编程技术网

C#-创建不同类型实例的方法

C#-创建不同类型实例的方法,c#,factory,C#,Factory,我已经创建了一个方法,作为一个工厂来推出我需要的连接类型。在本例中,我可能正在实例化类型SqlConnection和PrincipalContext,并返回该实例。该方法只接受一个参数,类型为Object。如果参数值为上述指定类型,它将创建该对象的实例。我的问题是该方法的返回类型是对象,因此调用该方法时需要强制转换 例如: SqlConnection connection2 = new SqlConnection(); SqlConnection sqlCon = (SqlConnection)

我已经创建了一个方法,作为一个工厂来推出我需要的连接类型。在本例中,我可能正在实例化类型
SqlConnection
PrincipalContext
,并返回该实例。该方法只接受一个参数,类型为
Object
。如果参数值为上述指定类型,它将创建该对象的实例。我的问题是该方法的返回类型是
对象
,因此调用该方法时需要强制转换

例如:

SqlConnection connection2 = new SqlConnection();
SqlConnection sqlCon = (SqlConnection)ConnectionFactory.RolloutConnectionType(connection2);
以及RolloutConnectionType方法:

public static Object RolloutConnectionType(Object obj) {
    if (obj == null) {
        if (obj is PrincipalContext) {//create new PrincipalContext
            string user, pass, domain;
            domain = ConfigurationManager.AppSettings["SAdomain"];
            user = ConfigurationManager.AppSettings["SAuser"];
            pass = ConfigurationManager.AppSettings["SApass"];

            obj = new PrincipalContext(ContextType.Domain, domain + ".mydomain.ca", "CN=MyCN,DC=myDC,DC=ca", user, pass);
        } else if (obj is SqlConnection) {//create new SqlConnection
            string connStr = System.Configuration.ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;

            obj = new SqlConnection(connStr);
        }
    }
    return obj;
}

我认为我在这方面做得对,但它看起来非常混乱,而且可能与创建实例所需的实例冗余-
connection2
RolloutConnectionType
中创建并返回
obj
。它能工作,但我不喜欢它的工作方式。我所尝试的可能吗?我还有其他途径吗?

假设您想坚持工厂模式,您应该考虑以下内容:

public interface Factory<T>
{
    T Create();
}

public class PrincipalContextFactory : IFactory<PrincipalContext>
{
    public PrinicipalContext Create()
    {
        // return new PrincipalContext(...);
    }
}

public class SqlConnectionFactory : IFactory<SqlConnection>
{
    public SqlConnection Create()
    {
        // return new SqlConnection(...);
    }
}
公共接口工厂
{
T Create();
}
公共类PrincipalContextFactory:IFactory
{
公共PrinicipalContext创建()
{
//返回新的PrincipalContext(…);
}
}
公共类SqlConnectionFactory:IFactory
{
公共SqlConnection创建()
{
//返回新的SqlConnection(…);
}
}

你的工厂只需要返回一个新的实例就可以了。您可以使用泛型(
Create()
),但现在您正在为模型创建一系列边缘案例,而不是
PrinicpalContext
SqlConnection

为什么不让您的factory类包含您试图创建的每个对象的静态方法,并让每个方法返回自己的正确类型转换对象

public static class YourFactory
{
   public static SqlConnection GetConnection()
   {
      string connStr = System.Configuration.ConfigurationManager
                          .ConnectionStrings["MyConnectionString"].ConnectionString;
      return new SqlConnection(connStr);
   }

   public static PrincipalContext GetPrincipalContext()
   {
        string user, pass, domain;
        domain = ConfigurationManager.AppSettings["SAdomain"];
        user = ConfigurationManager.AppSettings["SAuser"];
        pass = ConfigurationManager.AppSettings["SApass"];

        return new PrincipalContext(ContextType.Domain, domain + ".mydomain.ca",
                 "CN=MyCN,DC=myDC,DC=ca", user, pass);
    }
}

那么,您正在向工厂方法传递一个实例,然后将其重新定义为一个新实例?听起来不再像工厂了……为什么不让两个重载直接接受不同的类型并相应地返回这些类型呢?不需要演员阵容。@BradChristie承认这是相当混乱的。更重要的是,如果沿着这条路线做一些事情是可能的。我在OP中发布的更多的是一个示例,而不是我在现实生活中使用的东西。这实际上是我已经实现的,但我希望将它们合并到一个roll-out方法中。显然,我们不能有多个返回类型,
SqlConnection
PrincipalContext
,因此返回类型是
Object
。这可能吗?或者推荐信会坚持你上面的建议吗?@DrewKennedy:不能两全其美。您可以使用
对象
并强制转换它,或者使用严格类型的方法(尽管是返回类型或使用泛型)。@bradcristie ah好的。我希望有一些忍者的方式来做这件事,我可能忽略了。我感谢你的反馈。你的答案本身并没有错,所以我给你一个答案。@DrewKennedy说得清楚,如果你拥有这个对象,你可以实现你自己的
隐式
/
显式
强制转换操作符并强制转换它,但这不是很优雅。这实际上非常有用,并带来了一些新的可能性。谢谢更喜欢你的版本:)@DRapp:can实现
YourFactory:IFactory,IFactory
;-)