You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否简化泛型方法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'

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 06:48:19