C#泛型和铸造问题

C#泛型和铸造问题,第1张

概述我无法将对象转换为通用IList.我有一组in语句试图解决这个问题,但必须有一个更好的方法来做到这一点. 这是我目前的方法: string values;if (colFilter.Value is IList<int>){ values = BuildClause((IList<int>)colFilter.Value, prefix);}else if (colFilter. 我无法将对象转换为通用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.

我想要做的是:

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,true);}private static string BuildClause(IList<DateTime> inClause,true);}//.. etc for all typesprivate 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方法被重载并且每个重载都做了不同的事情(不仅仅是使用的类型不同,但是逻辑上真的不同,在这种情况下 – 选择是否添加引号)然后在某个地方,最终,你将不得不说“如果类型是这样做,如果类型就是这样”(我称之为“开启类型”).

另一种方法是避免使用“开启类型”逻辑并将其替换为多态.假设你有一个StringColFilter:ColFilter< string>和IntColFilter:ColFilter< int>,然后它们中的每一个都可以覆盖来自ColFilter< T>的虚拟方法.并提供自己的BuildClause实现(或者只是帮助BuildClause处理它的一些数据).但是,您需要显式创建正确的ColFilter子类型,它只是将“开关类型”逻辑移动到应用程序中的另一个位置.如果您很幸运,它会将该逻辑移动到您应用程序中您知道要处理的类型的位置,然后您可以在应用程序的不同位置明确创建不同的ColFilter并一般地处理它们稍后的.

考虑这样的事情:

abstract class ColFilter<T> {    abstract bool AddSingleQuotes { get; }    List<T> Values { get; }}class IntColFilter<T>{    overrIDe bool AddSingleQuotes { get { return false; } }    }class StringColFilter<T>{    overrIDe bool AddSingleQuotes { get { return true; } }}class SomeOtherClass {    public static string BuildClause<T>(string prefix,ColFilter<T> filter)    {        return BuildClause(prefix,filter.Values,filter.AddSingleQuotes);    }    public static string BuildClause<T>(string prefix,IList<T> values,bool addSingleQuotes)     {        // use your existing implementation,since here we don't care about types anymore --         // all we do is call ToString() on them.        // in fact,we don't need this method to be generic at all!    }}

当然这也让你了解ColFilter是否应该知道引用的问题,但这是一个设计问题,值得另一个问题:)

我还支持其他海报说,如果你试图通过将字符串连接在一起来构建创建SQL语句的东西,你应该停止这样做并转移到更容易,更重要的是更安全的参数化查询.

总结

以上是内存溢出为你收集整理的C#泛型和铸造问题全部内容,希望文章能够帮你解决C#泛型和铸造问题所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1221323.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存