我正在創建一個接口,它將由類實現,它將用作過濾器來創建查詢字符串。每個過濾器將負責在查詢中構造一個參數。用戶可以定義是否包括操作員以及操作員應該知道的值以及值。值的表達方式取決於數據類型。通用的值和參考類型的接口
布爾值: 「= 0」
整數: 「> = 2」
的DateTime: 「<> '2012-01-10'」
字符串:「='部分字符串'」
public interface IFilter<T>
{
Nullable<T> Value { get; set; }
String Operator { get; set; }
Boolean IncludeOperator { get; set; }
}
該接口將由抽象類實現,該類定義基本字段,屬性並覆蓋ToString方法;以及一個抽象的GetValueAsString()方法,該方法應該被重寫以執行從過濾器構造適當的字符串所需的任何邏輯。
public abstract class Filter<T> : IFilter<T>
{
Nullable<T> _value;
String _operator = "=";
Boolean _includeOperator = false;
public Nullable<T> Value { get { return this._value; } set { this._value = value; } }
public String Operator { get { return this._operator; } set { this._operator = value; } }
public Boolean IncludeOperator { get { return this._includeOperator; } set { this._includeOperator = value; } }
public override string ToString()
{
String param = GetValueAsString();
if (param != null && this.IncludeOperator)
return this.Operator + " " + param;
else if (param != null && !this.IncludeOperator)
return param.Trim();
else
return null;
}
protected abstract String GetValueAsString();
}
我想創建從接口和抽象類派生的類型化的過濾器。每個過濾器都知道如何將特定類型轉換爲包含在查詢中的字符串,但是每個過濾器都需要遵循IFilter接口,它可以通過繼承Filter基類來實現。
public class IntFilter: Filter<Int64>
{
protected override string GetValueAsString()
{
// Convert the integer to a string
return this.Value.Value.ToString();
}
}
public class BooleanFilter : Filter<Boolean>
{
protected override string GetValueAsString()
{
// convert the Boolean to a BIT value 1=True/0=False
return (this.Value.HasValue && this.Value.Value) ? "1" : "0";
}
}
public class DateTimeFilter : Filter<DateTime>
{
protected override string GetValueAsString()
{
// Convert the DateTime to a dateTime string in the following format - 2/27/2009 12:12:22 PM
return (this.Value.HasValue) ? this.Value.Value.ToString("G") : null;
}
}
這裏是棘手的地方...我需要創建一個字符串類型的過濾器,但使用相同的接口和抽象類。
public class StringFilter : Filter<String>
{
protected override string GetValueAsString()
{
// Convert the integer to a string
return this.Value.Value.ToString();
}
}
我需要能夠通過這些過濾器分爲以下幾個方法...
ExecuteQuery(IFilter filter);
你可以看到,有使用泛型類型的引用和值的問題類型。有沒有人有任何想法如何我可以使用這個相同的接口的所有類型的過濾器類? 是這可能嗎?
_value的類型是否真的需要爲可空的? –
Sam
過濾器必須始終返回一個通常初始化爲NULL的值。這可能意味着過濾器的ToString方法可能會返回一個字符串,例如...「= null」。由於調用方法可能正在處理這些列表,我不希望調用者重新確定值的狀態,然後進行反應。但說實話,我被困在繼承和Nullable類型的問題上,我沒有考慮改變我的邏輯部分。我會看看那個。謝謝! –
你可以添加你想要的ToString()的不同輸出嗎?這可能會幫助我理解你的目標是什麼。 – Sam