2012-08-25 51 views
0

我正在創建一個接口,它將由類實現,它將用作過濾器來創建查詢字符串。每個過濾器將負責在查詢中構造一個參數。用戶可以定義是否包括操作員以及操作員應該知道的值以及值。值的表達方式取決於數據類型。通用的值和參考類型的接口

布爾值: 「= 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); 

你可以看到,有使用泛型類型的引用和值的問題類型。有沒有人有任何想法如何我可以使用這個相同的接口的所有類型的過濾器類? 這可能嗎?

+0

_value的類型是否真的需要爲可空的? – Sam

+0

過濾器必須始終返回一個通常初始化爲NULL的值。這可能意味着過濾器的ToString方法可能會返回一個字符串,例如...「= null」。由於調用方法可能正在處理這些列表,我不希望調用者重新確定值的狀態,然後進行反應。但說實話,我被困在繼承和Nullable類型的問題上,我沒有考慮改變我的邏輯部分。我會看看那個。謝謝! –

+0

你可以添加你想要的ToString()的不同輸出嗎?這可能會幫助我理解你的目標是什麼。 – Sam

回答

0

您可以從定義中提取可空值<>然後將它們傳遞到實現中。這裏是一個例子:

public interface IFilter<T> 
{ 
    T Value { get; set; } 
    String Operator { get; set; } 
    Boolean IncludeOperator { get; set; } 
} 

public abstract class Filter<T> : IFilter<T> 
{ 
    T _value; 
    String _operator = "="; 
    Boolean _includeOperator = false; 

    public 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(); 
} 

public class IntFilter : Filter<Nullable<Int64>> 
{ 
    protected override string GetValueAsString() 
    { 
     // Convert the integer to a string 
     return this.Value.HasValue ? this.Value.ToString() : "0"; 
    } 
} 

public class BooleanFilter : Filter<Nullable<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<Nullable<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() 
    { 
     return string.IsNullOrWhiteSpace(Value) ? "" : Value; 
    } 
} 
+0

此解決方案提出的問題是,當我在GetValueAsString()方法中評估「this.Value」(_value字段的屬性)時,我需要使用「this.Value」。HasValue「來確定是否設置了該值,如果該值不是Nullable值,則該值不可用。從抽象類中刪除可空對象後,我嘗試使用空值覆蓋派生類中的字段和屬性定義,但獲取錯誤。 (類型必須是'long'以匹配被覆蓋的成員'Filter .Value')。是否有另一種方法來確定是否未設置值類型? –

+0

由於GetValueAsString是抽象的並且在子中實現,因此在編譯時將知道什麼是真正的類型,因此這個實現在我的測試中起作用。 – Sam