オブジェクトを汎用IListにキャストする際に問題があります。私はこれを回避しようとする声明のグループを持っていますが、これを行うにはより良い方法が必要です。C#Generics and Casting Issue
これが私の現在の方法である:
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);
:
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.
は私がやりたいことはこれです
これらのそれぞれ、このコンパイラエラー生成: 型または名前空間名は「colFilter」が見つかりませんでした(?あなたがusingディレクティブまたはアセンブリ参照が不足している)
私の例では、colFilter.ColumnTypeは、intです文字列、日時計などがあります。なぜこれが機能しないのか分かりません。
アイデア?
EDIT:これはここではC#2.0
EDIT#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();
}
コードを実行します。 私は値= BuildClause(colFilter.Value、prefix)を行った。それはOKと思われる。 colFilter.ValueがタイプIListであることが確かであればOKです。 –
私にとってはうまくいかないようですが、コンパイラエラーが発生します:BuildClauseのオーバーロードは何ですか? – Jon