草庐IT

Generics

全部标签

c# - “不要公开通用列表”,为什么在方法参数中使用 collection<T> 而不是 list<T>

我正在使用FxCop,它显示“不要公开通用列表”的警告,建议使用Collection而不是List.首选它的原因,我知道所有这些东西,如thisSOpost中所述和MSDN以及我浏览过的更多文章。但我的问题是,我很少有方法可以进行如此繁重的计算,并且方法接受List的参数。就性能而言,这应该更快更好。但是FxCop也为此发出警告。所以一个选择是我应该将参数声明为Collection,然后使用ToList()在方法内部,然后使用它。那么优化了哪一个呢?“抑制这种情况下的警告”或“在参数中使用Collection,然后在方法本身内部使用ToList()”。 最佳

c# - 将 .NET 库移植到 PCL 时如何解决缺少 ICloneable 接口(interface)的问题?

我正在将现有的.NET类库移植到可移植类库。.NET库广泛使用ICloneable接口(interface),不包括在可移植子集中。通常,我在.NET类库中遇到这样的类定义:publicclassFoowhereT:ICloneable{publicvoidBar(Titem){varx=item.Clone();...}}如何才能将此代码成功移植到可移植类库?我是否必须重写Clone方法调用,还是有侵入性较小的解决方法?我不能简单地删除通用类型约束whereT:ICloneable因为那时Bar方法将无法编译。我可以写一个替换接口(interface)来代替ICloneable在移植

c# - 是否可以将通用方法应用于项目列表?

假设我已经编写了自己的方法来反转列表。publicstaticvoidMyReverse(Listsource){varlength=source.Count;varhLength=length/2;for(vari=0;i我这样调用它,而且它有效。varfooList=newList();MyReverse(fooList);如果我想反转多个列表,我会这样调用。varfooList=newList();varbarList=newList();varbazList=newList();MyReverse(fooList);MyReverse(barList);MyReverse(ba

c# - 通用扩展方法 : Type argument cannot be inferred from the usage

我正在尝试创建一个适用于类型化数据表的通用扩展方法:publicstaticclassExtensions{publicstaticTableTypeDoSomething(thisTableTypetable,paramExpression>[]predicates)whereTableType:TypedTableBasewhereRowType:DataRow{//dosomethingtoeachrowofthetablewheretherowmatchesthepredicatesreturntable;}[STAThread]publicstaticvoidmain(){M

c# - C# 通用属性限制的解决方法

讨论here,C#不支持泛型属性声明。所以,我不允许做类似的事情:[Audit(UserAction.Update)]publicActionResultSomeMethod(intid){...这很适合我的属性impl类,因为我需要从通用存储库调用方法:UserfuuObj=(User)repository.LoadById(_id);我尝试使用this没有成功的解决方案。我可以传递类似typeOf(User)的内容,但我如何才能仅使用类型或魔术字符串调用LoadById?*T和User都扩展了一个名为Entity的基类。 最佳答案

c# - 重载泛型方法

当调用用于存储对象的通用方法时,有时需要以不同方式处理特定类型。我知道您不能基于约束进行重载,但任何其他替代方案似乎都会出现其自身的问题。publicboolSave(Tentity)whereT:class{...somestoragelogic...}我想做的是类似下面的事情:publicboolSave(Tentity){...speciallogic...}过去,我们的团队创建了“一次性”方法来保存这些类,如下所示:publicboolSaveSpecificClass(SpecificClasssc){...speciallogic...}但是,如果您不知道该功能的存在,并且

c# - 如何为具有类型参数约束的泛型类型编写扩展方法?

我正在使用一个任务特定的.NET平台,它是预编译的,而不是开源的。对于某些任务,我需要扩展此类,而不是继承它。我只是想添加一个方法。首先我想向您展示一个dummycode现有类:publicclassMatrixwhereT:new(){...publicTvalues[,];...}我想通过以下方式扩展这个类:publicstaticclassMatrixExtension{publicstaticTgetCalcResult(thisMatrixmat){Tresult=0;...returnresult;}}我从许多谷歌链接中得到了这个语法,所以不知道它是否正确。编译器告诉我没有

c# - 泛型,其中 T 是实现接口(interface)的类

我有一个界面:interfaceIProfile{...}...和一个类:[Serializable]classProfile:IProfile{privateProfile(){...}//privatetoensureonlyxmlserializercreatesinstances}...和一个有方法的经理:classProfileManager{publicTLoad(stringprofileName)whereT:class,IProfile{using(varstream=new.......){varser=newXmlSerializer(typeof(T));ret

c# - .NET 中是否有任何集合可以防止空条目?

我特别考虑的是满足集合契约的集合,但我认为这个问题可以适用于任何类型。.NET框架中是否有防止空条目的集合?我想要的具体行为是这样的:varset=newHashSet();booladded=set.Add(null);Console.WriteLine(added);//prints"False"这不是内置HashSet的行为.是否有任何集合具有这种(或类似)行为,或者我最好自己滚动?如果是后者,最好的方法是什么?我应该直接从HashSet继承吗?还是只是包裹起来?编辑:需要说明的是,这只是无聊的思考。主要是因为我想不出有什么理由让我想要允许null成一组对象。我对此没有任何特别的

c# - 将泛型限制为可空类型

我正在寻找这样的示例用法:FoostringFoo=newFoo("Theansweris");FoointFoo=newFoo(42);//TheValueofintFoo&stringFooarestronglytypedstringFoo.Nullify();intFoo.Nullify();if(stringFoo==null&&intFoo==null)MessageBox.Show("Botharenull);给定这个类Foo,我可以将T自动包装成一个可为null的对象:publicclassFoo1whereT:struct{privateT?_value;publicF