クエリ文字列を作成するためのフィルターとして使用されるクラスによって実装されるインターフェイスを作成しています。各フィルターは、クエリでパラメーターを構築する責任があります。ユーザーは、演算子を含めるかどうか、演算子の値、および値を定義できます。値の表現方法は、データ型によって異なります。
ブール値: " = 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 インターフェイスに準拠する必要があります。
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 );
Reference 型と Value 型の両方にジェネリック型を使用すると問題があることがわかります。型指定されたすべての Filter クラスにこの同じインターフェイスを使用する方法を知っている人はいますか? これは可能ですか?