Tag: generics

如何创建线程安全的通用列表?

我有一个通用列表如下 public static readonly List Customers = new List(); 我正在使用以下方法: .Add .Find .FirstOrDefault 最后2个是LINQ扩展。 我需要使这个线程安全的能够运行容器类的多个实例。 怎么实现呢?

为什么`IList `不inheritance自`IReadOnlyList `?

当在.NET 4.5中引入IReadOnlyList时,有一段时间我认为拼图的缺失部分最终被插入到位:一种传递真正的只读索引接口的方法,以前我必须使用我自己的只读接口并围绕一切创建包装类。 我期待接口被放置在“自然”层次结构中,理想情况是: IEnumerable .GetEnumerator() -> IReadOnlyCollection : IEnumerable .Count -> IReadOnlyList : IReadOnlyCollection .Item[…] -> IList : IReadOnlyList .Add(…) .Clear() .Contains(…) (etc) 但是,事实certificate, IList不会从IReadOnlyListinheritance 。 是否有一个原因?

如何通过JIT编译器编译generics?

我知道generics是由JIT编译的(就像其他所有东西一样),与编译代码时生成的模板形成对比。 问题是可以使用reflection在运行时创建新的generics类型。 这当然会影响通用的约束。 哪个已经通过了语义解析器。 有人能解释一下这是如何处理的吗? 究竟发生了什么? (代码生成和语义检查)

C#Generics是如何实现的?

我曾经认为C#中的Generics是这样实现的,当使用新的generics类型时,在运行时或编译时生成一个新的类/方法/你有什么,类似于C ++模板(我从来没有真正调查,我很可能是错的,我很乐意接受纠正。 但在我的编码中,我提出了一个确切的反例: static class Program { static void Main() { Test testVar = new Test(); GenericTest genericTest = new GenericTest(); int gen = genericTest.Get(testVar); RegularTest regTest = new RegularTest(); int reg = regTest.Get(testVar); if (gen == ((object)testVar).GetHashCode()) { Console.WriteLine(“Got Object’s hashcode from GenericTest!”); } if (reg == testVar.GetHashCode()) { Console.WriteLine(“Got Test’s hashcode from RegularTest!”); […]

如何在Ninject中绑定Generic类型的接口

我是Ninject的新手,在我实现通用存储库模式时发现自己陷入困境。 我想将依赖项IRepository 绑定到类ConcreteRepository ,其中ConcreteRepository 实现IRepository ,EntityType实现IEntityType。 我试过这个: kernel.Bind<IRepository>().To<ConcreteRepository>(); …但是Ninject不会接受它,因为它不知道或不关心EntityType实现IEntityType。 我怎样才能绑定这种依赖? UPDATE 这是我得到的错误: 错误3类型’ICM.Dependency.Repository.ConcreteRepository’不能在generics类型或方法’Ninject.Syntax.IBindingToSyntax.To()’中用作类型参数’TImplementation’。 没有从“ConcreteRepository ”到“IRepository ”的隐式引用转换。 解 我仍然不太明白为什么我的绑定不起作用,但显然我在那里使用generics不正确。 因此,该解决方案与NInject无关。 我结束了指定ConcreteRepository以显式连接IEntityType和TEntityType: public class ConcreteRepository : IRepository where TEntity : TInterface { … } 然后注射可以写成如下: kernel.Bind<IRepository>().To<ConcreteRepository>()

如何在WebService中返回通用字典

根据搜索,我想在C#中使用返回字典的Web服务: Dictionary GetValues(string search) {} Web服务编译很好,但是,当我尝试引用它时,我收到以下错误:“不支持,因为它实现了IDictionary。” ¿我能做些什么来使这个工作?,任何不涉及返回DataTable的想法?

当用作generics类型参数时,为什么“动态”不是所有类型的协变和逆变?

我想知道当用作generics类型参数时, dynamic是否在语义上等同于object 。 如果是这样,我很好奇为什么存在这种限制,因为在为变量或forms参数赋值时两者是不同的。 我在C#4.0中编写了一个小实验来梳理一些细节。 我定义了一些简单的接口和实现: interface ICovariance { T Method(); } interface IContravariance { void Method(T argument); } class Covariance : ICovariance { public T Method() { return default(T); } } class Contravariance : IContravariance { public void Method(T argument) { } } 实验的有趣细节: class Variance { static void Example() { ICovariance c1 = […]

.NET – 获取通用接口的所有实现?

关于“ 通过reflection实现接口 ”的答案显示了如何获得接口的所有实现。 但是,给定通用接口IInterface ,以下不起作用: var types = TypesImplementingInterface(typeof(IInterface)) 任何人都可以解释我如何修改该方法?

根据另一个列出一个列表

说我有 List ages = new List() { 8, 5, 3, 9, 2, 1, 7 }; List marks = new List() { 12, 17, 08, 15, 19, 02, 11 }; 我可以按照以下ages对我的marks进行排序: while (true) { bool swapped = false; for (int i = 0; i ages[i + 1]) { int tmp = ages[i]; ages[i] = ages[i + […]

使用generics类型’System.Collections.Generic.List ‘需要1个类型参数

这是什么意思? 我在ASP.NET MVC中使用了一个列表列表,并通过ActionResuls ViewData发送它们以在视图中检索它。 但是,当我将其更改为列表列表时,它会给我一个HttpWebException错误。 当我在即时窗口内检查它时,它告诉我错误是: 使用generics类型’System.Collections.Generic.List ‘需要1个类型参数 那么,它是什么意思,我做错了什么呢?