Tag: generics

创建基于编译器的“字典”的非静态版本,其中键是类型

有一个非常简单的技巧,它创建了一个类似字典的结构,其中键是类型。 该结构的行为类似于Dictionary ,其中键是Type对象,值是相应类型的实例。 这个奇妙的结构和变量或数组一样快,因为“查找”只由编译器/ JITter执行一次,并且正确的值引用被编译到程序中。 public static class MyDict { public static T Value { get; set; } } 您可以像这样使用该结构: MyDict.Value = MyDict.Value.ToString(); 问题是这个“字典”是全球性的。 创建不同字典的唯一方法是创建不同的类。 如何创建一个类似的(最快的“查找”,没有拳击)非静态结构? (没有代码生成。) 简单地说:我希望有多个Dictionary类似的对象,没有查找成本,转换和装箱。

如何使用Unity的名称动态注册generics类?

我有一个包含很多类(300+)和BaseClass的程序集,我希望注册一个带接口的generics类。 如果要解析接口的对象数组,则必须通过{ Name }注册。 我想自动在MainViewModel中有一个对象数组。 有没有办法用reflection自动化这个? 有什么建议? 示例(伪): public class BaseClass { public void doFoo(); } public ClassNumber001 : BaseClass { } public ClassNumber002 : BaseClass { } public interface ISuperman { } public class Superman : ISuperman where T : BaseClass { } public MainViewModel(IEnumerable lotsofSuperman) { } 手工实例: container.RegisterType<ISuperman, Superman >(“ClassNumber001”); container.RegisterType<ISuperman, Superman […]

.NET Micro框架和不支持的function。 有什么影响?

我发现这个表列出了嵌入式开发中.NET Micro框架的局限性,它指出由于这将产生的图像大小,generics不可用。 内存占用量必须低于300KB,并且包含generics会将大小超过此限制。 这是否意味着任何Micro框架代码都需要回到ArrayList的方式以及相关的类型安全缺乏? 这些限制对使用.NET微框架的开发还有哪些其他影响? 谢谢

如何获取字典中的键的ReadOnlyCollection

我的类包含Dictionary dict ,我想公开键的ReadOnlyCollection 。 如何在不将Dictionary.KeyCollection dict.Keys到数组然后将数组作为ReadOnlyCollection公开的情况下执行此操作? 我希望ReadOnlyCollection是一个合适的包装器,即。 反映基础字典中的变化,据我所知,将集合复制到数组将不会这样做(以及看似效率低下 – 我实际上并不想要一个新的集合,只是为了公开底层的密钥集合.. )。 任何想法将不胜感激! 编辑:我正在使用C#2.0,因此没有.ToList(轻松)可用的扩展方法。

Simple Injector – 使用相同generics类型的另一个依赖项注册装饰器

我想我在Simple Injector的RegisterDecorator()偶然发现了一个怪癖。 它甚至出现在最近的2.5.0中。 我有一种情况,我想装饰一个封闭的generics类型,例如ICommandHandler ,一个装饰器(通过构造函数注入)一个类型为ICommandHandler的内部处理程序,还有另一种类型的处理程序,比如ICommandHandler 。 尽管这些命令处理程序类型是不同的,但是当我在这样的装饰器类型上调用RegisterDecorator时,SimpleInjector似乎会混淆并引发exception: ArgumentException:为了使容器能够使用MessageLogger作为装饰器,其构造函数必须包含ICommandHandler类型的单个参数(或Func<ICommandHandler> ) – 即正在装饰的实例的类型。 参数类型ICommandHandler在类MessageLogger的构造函数中定义多次。 …即使装饰器显然只有一个ICommandHandler参数。 以下是抛出exception的完整工作示例: public interface ICommandHandler { void Execute(T command); } public class LogCommand { public string LogMessage { get; set; } public DateTime Time { get; set; } } public class Logger : ICommandHandler { public void Execute(LogCommand command) { Debug.WriteLine(string.Format(“Message \”{0}\” sent […]

传递接口集合

假设您有以下课程: class Car : IPainting { … } 然后像这样的函数: void AddCars(IEnumerable collection) 然后像这样的代码片段: Car bmw = new Car(); Car mercedes = new Car(); IPainting a = (IPainting) bmw; IPainting b = (IPainting) mercedes; IPainting[] paintings = new IPainting[] {a, b}; AddCars(paintings); // fails to compile 这当然不能编译,因为AddCars()方法只接受Cars的集合,但它是’painting’数组的组成部分。 我知道C#4.0可能会为此提供解决方案。 今天有没有解决方法呢? 谢谢, 阿尔贝托

是否可以在C#中使用无类型generics列表?

我正在尝试以下设计但没有成功: abstract class Foo { abstract T Output { get; } } class Bar { List Foos; } 我不喜欢使用数组列表,因为我必须使用不安全的转换来获取类型。 我想要输入Foo,以便“输​​出”不仅仅是一个对象,在这种情况下我也必须使用不安全的强制转换。 正如我的代码目前,我使用Foo无类型输出作为对象。

通用接口列表

如果我有一个带有几个实现类的通用接口,例如: public interface IDataElement { int DataElement { get; set; } T Value { get; set; } } public class IntegerDataElement : IDataElement { public int DataElement { get; set; } public int Value { get; set; } } public class StringDataElement : IDataElement { public int DataElement { get; set; } public String Value […]

将一些C#通用代码重写为F#

我正在尝试重写这样的通用代码(C#): U Upcast(T x) where T : U { return x; } 在F#中: let ucast ‘U> (x: ‘T) = x :> ‘U 但是F#约束求解的工作方式与C#不同,编译器会输出一堆输入错误: 错误FS0698:无效约束:用于约束的类型是密封的,这意味着约束只能通过最多一个解决方案来满足 警告FS0064:此构造导致代码不像类型注释所指示的那样通用。 类型变量’T已被约束为类型”U’。 错误FS0663:此类型参数的使用方式将其限制为始终为“U” 错误FS0013:从“U”到“U”类型的静态强制 涉及基于此程序点之前的信息的不确定类型。 某些类型不允许静态强制。 需要进一步的类型注释。 错误FS0661:此绑定的一个或多个显式类或函数类型变量无法一般化,因为它们被约束为其他类型 请解释一下如何正确地重写上面的C#代码以及为什么我写的F#版本没有编译。

逆变? 协方差? 这个通用架构有什么问题……?

我在设置命令处理架构时遇到了一些问题。 我希望能够创建从ICommand派生的许多不同的命令; 然后,创建从ICommandHandler派生的许多不同的命令处理程序; 这是我开始定义的接口和类: interface ICommand {} class CreateItemCommand : ICommand {} interface ICommandHandler where TCommand : ICommand { void Handle(TCommand command); } class CreateItemCommandHandler : ICommandHandler { public void Handle(CreateItemCommand command) { // Handle the command here } } 我有一个可以创建适当类型的命令的帮助程序类: class CommandResolver { ICommand GetCommand(Message message) { return new CreateItemCommand(); // Handle other commands […]