オープンソースプログラムを変更して、Silverlightのデータグリッド用の汎用フィルターを作成しています。クラスのコードを以下に示します。
public PropertyData Property { get; set; }
public FilterOperatorType FilterOperator { get; set; }
public string FilterValue { get; set; }
public Expression GetExpression<T>(ParameterExpression pe)
{
if (Property == null || Property.PropertyName == null)
return null;
PropertyInfo prop = typeof(T).GetProperty(Property.PropertyName);
Expression left = Expression.Property(pe, prop);
Expression right = null;
switch (prop.PropertyType.Name)
{
case "String":
right = Expression.Constant(FilterValue);
break;
case "Int32":
int val;
int.TryParse(FilterValue, out val);
right = Expression.Constant(val);
break;
case "Int64":
int.TryParse(FilterValue, out val);
Convert.ToInt32(val); //does not work
right = Expression.Constant(val);
break;
case "DateTime":
DateTime dt;
DateTime.TryParse(FilterValue, out dt);
right = Expression.Constant(dt);
break;
}
switch (FilterOperator)
{
case FilterOperatorType.Equal:
return Expression.Equal(left, right);
case FilterOperatorType.GreaterThan:
return Expression.GreaterThan(left, right);
case FilterOperatorType.GreaterThanOrEqual:
return Expression.GreaterThanOrEqual(left, right);
case FilterOperatorType.LessThan:
return Expression.LessThan(left, right);
case FilterOperatorType.LessThanOrEqual:
return Expression.LessThanOrEqual(left, right);
case FilterOperatorType.NotEqual:
return Expression.NotEqual(left, right);
}
return null;
}
}
整数でフィルタリングしようとすると、次の状態のInvalidOperationExceptionが発生します。二項演算子Equalは、タイプ「System.Int64」および「System.Int32」に対して定義されていません。
この例外がスローされる理由は理解していますが、このコードのサンプルプログラムでは、ユーザーが入力した整数がInt32型であるため、例外は発生しませんが、私のアプリケーションではInt64です。誰かがこれを修正する方法について何かアイデアがありますか?