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