能否简化泛型方法TestObject调用?避免重复指定ID泛型类型
简化泛型方法的类型参数传递问题
现有如下C#代码:
public abstract class IdProperty<ID> { public ID Id { get; set; } } public class ClassOfAbstract : IdProperty<int> { } public T TestObject<T, ID>() where T : IdProperty<ID> { T item = default(T); //some logic return item; } [Test] public void RunTest() { var item = TestObject<ClassOfAbstract, int>(); }
由于ClassOfAbstract已明确继承IdProperty<int>,其泛型类型ID已确定,希望简化TestObject方法,无需重复传入int类型参数,期望修改后代码如下:
//NO CHANGE public abstract class IdProperty<ID> //NO CHANGE public class ClassOfAbstract : IdProperty<int> { } public T TestObject<T>() where T : IdProperty<???> { T item = default(T); //some logic return item; } [Test] public void RunTest() { var item = TestObject<ClassOfAbstract>(); }
请问这种实现方式是否可行?
可行,在C# 7.3及以上版本中,支持开放构造类型的泛型约束,可以直接将约束写成where T : IdProperty<>,不需要显式指定ID的具体类型,编译器会根据T的继承关系自动推断对应的ID类型。
修改后的完整代码如下:
public abstract class IdProperty<ID> { public ID Id { get; set; } } public class ClassOfAbstract : IdProperty<int> { } public T TestObject<T>() where T : IdProperty<> { T item = default(T); //some logic return item; } [Test] public void RunTest() { var item = TestObject<ClassOfAbstract>(); }
如果项目使用低于C# 7.3的版本,也可以通过反射获取T继承的IdProperty<ID>中的ID类型,但这种方式存在性能损耗,不如开放构造类型约束简洁高效。
内容的提问来源于stack exchange,提问作者Peter Larsen 'CPH'
相关产品推荐
相关产品推荐

