[英]How to define baseclass or interface for constants?
在我的應用程序中,我需要為多個類定義一組相同的Constant值,並且我想將所有它們的一個基類/接口用作我的通用類的類型參數。
//I know following code will not work, just trying to demonstrate the problem
public interface IConstantsDefined
{
static const string DbName;
static const string TableName;
static const string ColumnName;
}
public static class Product : IConstantsDefined
{
public static const string DbName = "ProductDB";
public static const string TableName = "Products";
public static const string ColumnName = "ProductId";
}
public static class Sales: IConstantsDefined
{
public static const string DbName = "SalesDb";
public static const string TableName = "Sales";
public static const string ColumnName = "SaleId";
}
public class DbConnection<TConsts> where TConsts : IConstantsDefined
{
// use TConsts.DbName, TConsts.TableName here
}
我了解我在上面寫的內容將在C#中引發許多錯誤。 我知道靜態類不能從接口繼承。 我的問題是,在考慮性能和內存的情況下,構建這種系統的最佳設計/方法是什么?
常量被定義和初始化一次。
public interface IConstantsDefined
{
static const string Foo = "Foo";
static const string Bar = "Bar";
}
您想要的是抽象的僅獲取字段:
public interface IConstantsDefined
{
string DbName { get };
string TableName { get };
string ColumnName { get };
}
public class Product : IConstantsDefined
{
public string DbName { get { return "ProductDB" } };
public string TableName { get { return "Products" } };
public string ColumnName { get { return "ProductId" } };
}
public class Sales: IConstantsDefined
{
public string DbName { get { return "ProductDB" } };
public string TableName { get { return "Sales" } };
public string ColumnName { get { return "SaleId" } };
}
由於您不需要/想要產品和銷售類型的多個實例,因此您可能要考慮完全刪除這些類型,因為這幾乎是一個類的定義:
public class ConstantsDefined
{
public string DbName { get; private set; };
public string TableName { get; private set; };
public string ColumnName { get; private set; };
public static readonly ConstantsDefined Product = new ConstantsDefined()
{
DbName = "ProductDB",
TableName = "Products",
ColumnName = "ProductId",
};
}
您可以嘗試使用@nabuchodonossor的評論。 或者,您可以創建實現接口IMetadata的元數據類ProductMetadata和SalesMetadata。 然后,在需要時,您可以使用工廠通過傳入實際的Model信息(例如typeof(Sales))來獲取元數據實例。
使用基本抽象類,這是最想要實現的:
abstract class Base
{
public abstract string DbName { get; }
}
class Product : Base
{
public override string DbName => "ProductDB";
}
class Sales : Base
{
public override string DbName => "SalesDB";
}
class DbConnection<T> where T : Base
{
public string Test(T instance) => instance.DbName;
}
這確實需要instance
, instance
可以由DbConnection
保留,可以由服務提供者解析,等等。
我所有的Product或Sales類都將包含各種常量,因此我不想創建這些常量的實例
這個要求基本上改變了一切。 在給定的上下文中,您似乎將常量理解為“無法更改的值”。 這是不可變的類型。 然后,您不需要泛型即可使用常量構造類型,只需傳遞參數即可 (就像處理任何不可變類型一樣):
class DbConnection
{
public string DbName { get; }
public DbConnection(string dbName)
{
DbName = dbName;
}
}
用法:您只需執行new DbConnection("ProductDB")
即可,而不是神秘的new DbConnection<Product>()
new DbConnection("ProductDB")
。 如果您有多個參數,請考慮將其包裝並將實例傳遞給構造函數。 這就是您得到抽象類和非靜態繼承的地方,如我的第一個代碼片段: new DbConnection(new Product())
(而DbConnection
將要求傳遞Base
類型)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.