c#使用Generic作为方法参数

时间:2014-04-29 12:29:11

标签: c# inheritance

我有一个为不同项目扩展的BaseConfig类。 BaseConfig类包含我们开发的任何项目中常见的方法。 BaseConfig就像这样设置(只是整个类的片段):

    public abstract class BaseConfig<T> where T:BaseConfig<T>
    {
        #region Serialized Class Members

        /// <summary>
        /// The License key for this product
        /// </summary>
        public string LicenseKey;

        /// <summary>
        /// Database connection information
        /// </summary>
        public class Database
        {
            public String ServerName;
            public String DatabaseName;
            public bool IntegratedSecurity;
            public String UserName;
            public String Password;
            public String ConnectionStringOptions;
        }
        public Database DatabaseInfo;
....

我们将此BaseConfig类与config.xml文件结合使用,该文件包含特定于客户的信息(如数据库信息)。

我想创建一个ConnectToSQL()的公共方法,可以由任何扩展BaseConfig的类调用。

重要提示:ConnectToSQL()将在BaseConfig以外的类中(类似于SQLConnectionClass(),但在同一个项目中)。

我需要设置一个方法:

private SqlConnection ConnectToSQL(Configuration.BaseConfig<T>.Database dbInfo)

然后被称为:

SqlConnection _conn = ConnectToSQL(databaseInfo);

其中databaseInfo来自扩展BaseConfig的类

但是,SqlConnection()抱怨'无法找到类型或命名空间类型T'。

任何人都知道如何设置此方法?

2 个答案:

答案 0 :(得分:2)

在我看来Database不应该在BaseConfig<T>之内 - 它应该是顶级的。您 这就是问题所在 - 这些是两种有效且不同的类型,而您的方法参数并不能表达它们感兴趣的内容。

我还强烈建议使用属性而不是那些公共字段 - 并且可能使BaseConfig<Foo>.Database类型不可变。

答案 1 :(得分:0)

这是你想要做的吗?

public abstract class BaseConfig<T> where T : BaseConfig<T>
{

    /// <summary>
    /// Database connection information
    /// </summary>
    public class Database
    {
        public String ServerName;
        public String DatabaseName;
        public bool IntegratedSecurity;
        public String UserName;
        public String Password;
        public String ConnectionStringOptions;
    }
    public Database DatabaseInfo { get; set; }

    public abstract SqlConnection ConnectToSQL(Database info);
}

public class MyConfig : BaseConfig<MyConfig>
{
    public override SqlConnection ConnectToSQL(Database info)
    {
         ...
    }
}

class Program
{
    static void Main(string[] args)
    {
        var cfg=new MyConfig();
        cfg.ConnectToSQL(cfg.DatabaseInfo);
    }
}