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

c#使用泛型作为方法参数

c#使用泛型作为方法参数,c#,inheritance,C#,Inheritance,我有一个BaseConfig类,它是为不同的项目扩展的。BaseConfig类包含我们开发的任何项目中常见的方法。BaseConfig的设置如下(只是整个类的一个片段): 其中databaseInfo来自扩展BaseConfig的类 但是,SqlConnection()抱怨“找不到类型或命名空间类型T” 有人知道我如何设置这个方法吗?在我看来,数据库无论如何都不应该在BaseConfig中-它应该是一个顶级类。对于BaseConfig.Database,BaseConfig.Database等,

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

其中databaseInfo来自扩展BaseConfig的类

但是,SqlConnection()抱怨“找不到类型或命名空间类型T”


有人知道我如何设置这个方法吗?

在我看来,
数据库
无论如何都不应该在
BaseConfig
中-它应该是一个顶级类。对于
BaseConfig.Database
BaseConfig.Database
等,您确实不需要不同的类型,是吗?这就是问题所在——这是两种有效且不同的类型,而您的方法参数不能表示它感兴趣的类型


我还强烈建议使用属性而不是那些公共字段,并可能使
数据库
类型不可变。

这就是您想要做的吗

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);
    }
}
公共抽象类BaseConfig,其中T:BaseConfig
{
/// 
///数据库连接信息
/// 
公共类数据库
{
公共字符串ServerName;
公共字符串数据库名;
公共布尔综合安全;
公共字符串用户名;
公共字符串密码;
公共字符串连接字符串选项;
}
公共数据库DatabaseInfo{get;set;}
公共抽象SqlConnection-ConnectToSQL(数据库信息);
}
公共类MyConfig:BaseConfig
{
公共覆盖SqlConnection ConnectToSQL(数据库信息)
{
...
}
}
班级计划
{
静态void Main(字符串[]参数)
{
var cfg=新的MyConfig();
ConnectToSQL(cfg.DatabaseInfo);
}
}

如果
数据库
类不使用
T
那么为什么嵌套?请解释
ConnectToSQL()
的确切位置。将框架代码与其他类一起添加(并删除示例中不需要的部分,如
LicenseKey
)BaseConfig是一个包含有关产品信息的类。从config.xml文件加载的所有产品(数据库信息、许可证密钥等)中都有许多数据是一致的。BaseConfig的要点是在我们所有的产品中提供类似的信息。此外,这些信息需要通过用户界面进行更新,所以我不能使它们不可变。所有这些都不表明
数据库
应该是嵌套类型。。。您可以使
数据库
不可变。。。如果您需要具有不同值的新实例,只需创建一个。我明白您的意思。我已经将数据库移到了一个顶级类,现在可以调用它,而无需使用。
private SqlConnection ConnectToSQL(Configuration.BaseConfig<T>.Database dbInfo)
SqlConnection _conn = ConnectToSQL(databaseInfo);
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);
    }
}