У меня возникли проблемы с литьем объекта в общий IList. У меня есть группа заявлений, чтобы попытаться обойти это, но должен быть лучший способ сделать это.C# Generics и Casting Issue
Это мой текущий метод:
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.
То, что я хочу сделать это:
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» не может быть найден (? Вы пропали без вести с помощью директивы или ссылка на сборку)
В моем примере, colFilter.ColumnType является INT, строка, дата и т. д. Я не уверен, почему это не работает.
Любые идеи?
EDIT: Это 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();
}
Я запускаю ваш код. Я сделал values = BuildClause (colFilter.Value, prefix); это кажется ОК. Если вы уверены, что colFilter.Value - это тип IList, все должно быть в порядке. –
, который, похоже, не работает для меня, я получаю ошибку компилятора: что у вас есть перегруженность BuildClause? – Jon