能否省略泛型方法的TOptions参数?确保泛型类型匹配同内部类型接口
如何省略泛型方法中的TOptions参数?
你的原始代码:
public void Create<TFrame, TOptions, TBuilder>(Action<TBuilder> configurer) where TFrame : IConfigurable<TOptions> where TBuilder : IOptionsBuilder<TOptions> { }
你的核心需求:能否省略TOptions泛型参数?不需要关心TOptions具体类型,只要TFrame具备T Options {set;}属性,TBuilder具备T Options {get;}属性即可。
可以省略TOptions参数,核心是用无绑定具体类型的泛型接口来约束类型,让编译器自动推断关联的属性类型,不需要显式声明TOptions。
具体实现步骤:
- 定义两个泛型接口,分别描述“可写Options”和“可读Options”的约束:
// 约束类型必须有可设置的Options属性,类型为T public interface IHasWritableOptions<T> { T Options { set; } } // 约束类型必须有可获取的Options属性,类型为T public interface IHasReadableOptions<T> { T Options { get; } }
- 修改
Create方法的泛型约束,去掉TOptions,改用上述接口关联属性类型:
public void Create<TFrame, TBuilder, T>(Action<TBuilder> configurer) where TFrame : IHasWritableOptions<T> where TBuilder : IHasReadableOptions<T> { // 示例逻辑:创建实例、配置builder、同步Options var frame = Activator.CreateInstance<TFrame>(); var builder = Activator.CreateInstance<TBuilder>(); configurer(builder); frame.Options = builder.Options; // 两者Options类型一致,可直接赋值 }
- 调用时无需显式声明泛型参数,编译器会自动推断:
// 直接传入builder的配置逻辑即可,泛型参数全靠推断 Create(builder => { builder.Options = new YourOptionsType(); });
补充说明:
如果原有代码里的IConfigurable<TOptions>和IOptionsBuilder<TOptions>还需要保留,可以让它们继承新定义的接口,比如:
public interface IConfigurable<TOptions> : IHasWritableOptions<TOptions> { } public interface IOptionsBuilder<TOptions> : IHasReadableOptions<TOptions> { }
这样原有的类型体系不受影响,同时能实现省略TOptions参数的需求。
内容的提问来源于stack exchange,提问作者Celeste Soueid
相关产品推荐
相关产品推荐

