问题标签 [open-generics]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - C#继承开放泛型编译
今天我的大脑死了,我想不出一个干净的方法来强制编译器使用继承进行通用推理。
想象一下以下4个类
楷模
实体
现在对我来说,从逻辑上讲,我应该理所当然地认为,当我通过继承获取继承自ModelEntity<>
(它将指定的类型TModel
)的东西时,因为任何继承自的类ModelEntity<>
都必须指定它。
反正有没有强制编译器为我解决这个问题?
例如
如果我目前想使用ModelEntity<>
,我必须为它指定一个类型。如下所示:
我怎样才能摆脱TModel
无处不在的争论?在编译时仍然可以访问 TModel 类型?例如通过基础Model
属性。
对我来说,类似于以下内容:
会很有意义,因为当我调用它时,我应该指定的是例如
而不是
这是目前可能的吗?
这是否值得为 C# 6/7 提出?
c# - Castle Windsor:开放泛型类型的条件注册
我有以下内容:
我想在Castle Windsor DI进行有条件的注册IRepository<T>
,如果T
是ISuperType
,则提供ISuperRepository<T>
。否则,提供IRepository<T>.
例如,如果A : ISuperType
,那么我想Resolve<IRepository<A>>
提供SuperRepository<A>
,并Resolve<IRepository<B>>
提供Repository<B>
。
我怎样才能做到这一点?
generics - Automapper 和开放泛型
我正在尝试使用https://github.com/AutoMapper/AutoMapper/wiki/Open-Generics中描述的 Automapper 的开放泛型来执行用户和帐户之间的映射。
我创建了源和目标
我想在 AccountService 中执行映射
但我得到一个例外
缺少类型映射配置或不支持的映射。
映射类型:用户 -> 帐户 OpenGenerics.Console.Models.User -> OpenGenerics.Console.Models.Account
目标路径:Destination`1.Value.Value
源值:OpenGenerics.Console.Models.User
我确认了https://github.com/AutoMapper/AutoMapper/wiki/Open-Generics中的方法适用于int
和double
编辑 这对我来说可能是一个解决方案,但它有点乱。
c# - Structuremap为开放的泛型类型返回错误的实例?
我正在尝试使用带有开放泛型的结构图在运行时获取事件处理程序的实例,我正在使用基于开放泛型的配置
我的代码适用于像这样通过构造函数注入请求依赖的情况。
但是,在我的一种情况下,我需要在运行时获取依赖项。下面是我正在使用的代码
我收到以下错误。{"'MyNameSpace.EventHandlerClass.Handle(MyNameSpace.Events.ThirdEvent)' 的最佳重载方法匹配有一些无效参数"}
尽管我用正确的类型调用了 GetAllInstances,但 GetAllInstances 似乎以某种方式返回了一个带有 Handle 方法的 EventHandlerClass 对象,该方法期望 ThirdEvent 事件。
这是一个错误吗?还是我在配置中犯了错误?
c# - 使用 Autofac 注册和解析具有许多泛型参数的开放泛型类型
由于通用接口,我想解决一个开放的通用服务。我使用自动法。
每个具体服务仅适用于具体类。
我只能用单个generic param
[see SingleOpenGenericResolveTest
] 解决一项服务。是否有可能注册和解决许多服务T-params
[参见MultiOpenGenericResolveTest
]?
我只添加了一个具体类,IService
但它可能是很多类T
。(TRegion : Region, TRegion : BigRegion
等...)
这是 NUnit 3 测试,或者您可以在此处下载我的解决方案:https ://www.dropbox.com/s/vqmdwb6hwmzgjrb/AutofacResolveTests.zip?dl=0
c# - C# 打开泛型类型比较。Generic<> 是 Generic 的“父级”?
我有一个 MyGeneric<T> 类,以及一些从 MyGeneric<string>、MyGeneric<int>、MyGeneric<double>... 等类型创建的缓存数据。
我必须在某个地方检查某些数据以查看它是否是 MyGeneric,我的代码如下:
或者
或者这种愚蠢的实现有效,但我想把它扔掉:
有没有办法检查实际数据类型和开放泛型类型 (MyGeneric<>) 之间的关系?
c# - 从 Autofac Builder 获取所有 AsClosedTypesOf 注册变体
让我们假设这些类/接口:
我想自动注册 ICommandHandler<> 的所有实现。所有变体(Register*)都是有效的解决方案,即使我更喜欢 Action 参数,因为它更灵活并且不依赖于 Handler 接口(只是动作委托)。
Autofac 能够根据程序集扫描注册类型并注册找到的通用接口的实现,例如:
所以我已经注册了所有实现。现在我需要将它们全部自动注册到TheCommandBus。怎么做?
我可以通过添加这些行来手动执行此操作(例如在 OnActivated 期间):
如果我想在注册期间在 lambda 表达式中使用这种类型,我会遇到问题,我需要识别具体类型,就像这个关于另一个组件激活过程的示例一样。但我不想手动列出所有这些...自动想要这样的东西。
如何捕获所有 ICommandHandler 实现并使用 Register* 方法自动注册它们?
编辑:
另一种变体是扩展 SomeCommandHandler 类以在其构造函数中解析时注册自身:
这样我必须向 AsClosedTypesOf 注册结果提供 AutoActivate() 。(一个可能的解决方案,但现在“处理者”有两个职责......注册和处理)
c# - 使用开放泛型注册装饰器
我希望得到一些关于如何为某些特定合约和实现注册装饰器的反馈。这是我所拥有的
像这样的标记查询界面
像这样的查询处理程序合同
像这样的实际查询
最后是这样的查询处理程序
这是我的查询处理程序的日志装饰器
当我尝试使用 simpleinjector 注册装饰器注册此设置时
它失败并说“使用 IQueryHandlerNew 需要 2 个类型参数”
我使用类似的设置来注册具有 1 个类型参数的装饰器(例如用于存储库)并且它注册得很好。
不知道我在这里做错了什么。simpleinjector 和注册装饰器有超过 1 个类型参数的已知限制吗?
generics - 使用开放泛型自动映射并在 ForMember 语句中包含源代码
我最近从 Automapper 4.2.1 升级到了 5.1.1,并且遇到了之前涉及开放泛型的有效映射的问题。
以前,在自动映射器配置中,我有以下打开的通用映射配置
这在 Automapper 4 中有效,但在 5 中InvalidOperaionException
尝试通过IMapper.Map<TDestination>(source)
. 执行Items 操作的映射时似乎失败,并出现ForMember
异常消息“序列不包含匹配元素”
正如在下面的示例实现代码中所反映的
IPager<TSource>
implements IEnumerable<TSource>
,并且 的Items
属性ModelPager<TDestination>
是 anIEnumerable<TDestination>
所以强制转换应该是有效的。TSource
并且每个到都存在一个有效的映射TDestination
IPager接口
IPager实现
模型寻呼机
什么是在 Automapper 5 中映射它的正确方法,而不是通过显式映射每个可能的映射来放弃开放泛型,或者通过使用需要我手动映射所有属性并使用反射来解析开放类型的自定义开放泛型类型转换器任务?
c# - 如何使用 Autofac 注册和解析具有两种类型参数的开放泛型作为具有一种类型参数的接口
问题
我有许多具有两个类型参数的具体泛型类,它们实现了具有一个类型参数的泛型接口。例如:
我像这样使用 Autofac 注册它们:
当尝试解决这样的实例时ISomeService<Foo>
:
我收到一个Autofac.Core.Registration.ComponentNotRegisteredException
异常,说请求的服务ISomeService`1[[Foo]]
尚未注册。
问题
- 我想用 Autofac 做的事情是不可能的吗?
- 如果是这样,是否有解决方法?
- 如果没有,其他 DI 容器是否提供这种能力,例如 SimpleInjector?