我遇到了一个问题,无法将对象强制转换为通用的IList。我有一组in语句来尝试解决这个问题,但肯定有更好的方法。
这是我的当前方法:
string values;
if (colFilter.Value is IList<int>)
{
values = BuildClause((IList<int>)colFilter.Value, prefix);
}
else if (colFilter.Value is IList<string>)
{
values = BuildClause((IList<string>)colFilter.Value, prefix);
}
else if (colFilter.Value is IList<DateTime>)
{
values = BuildClause((IList<DateTime>)colFilter.Value, prefix);
}
else if (...) //etc.
What I want to do is this:
values = BuildClause((IList<colFilter.ColumnType>)colFilter.Value, prefix);
或者
values = BuildClause((IList<typeof(colFilter.ColumnType)>)colFilter.Value, prefix);
或者
values = BuildClause((IList<colFilter.ColumnType.GetType()>)colFilter.Value, prefix);
每个方法都会产生这个编译错误: 类型或命名空间名称“colFilter”无法找到(是否缺少 using 指令或程序集引用?)
在我的示例中,colFilter.ColumnType 是 int、string、datetime 等。我不确定为什么它不起作用。
有任何想法吗?
编辑:这是 C#2.0
编辑 #2
这是 BuildClause 方法(我为每种类型都有重载):
private static string BuildClause(IList<int> inClause, string strPrefix)
{
return BuildClause(inClause, strPrefix, false);
}
private static string BuildClause(IList<String> inClause, string strPrefix)
{
return BuildClause(inClause, strPrefix, true);
}
private static string BuildClause(IList<DateTime> inClause, string strPrefix)
{
return BuildClause(inClause, strPrefix, true);
}
//.. etc for all types
private static string BuildClause<T>(IList<T> inClause, string strPrefix, bool addSingleQuotes)
{
StringBuilder sb = new StringBuilder();
//Check to make sure inclause has objects
if (inClause.Count > 0)
{
sb.Append(strPrefix);
sb.Append(" IN(");
for (int i = 0; i < inClause.Count; i++)
{
if (addSingleQuotes)
{
sb.AppendFormat("'{0}'", inClause[i].ToString().Replace("'", "''"));
}
else
{
sb.Append(inClause[i].ToString());
}
if (i != inClause.Count - 1)
{
sb.Append(",");
}
}
sb.Append(") ");
}
else
{
throw new Exception("Item count for In() Clause must be greater than 0.");
}
return sb.ToString();
}