如何指定泛型方法的T类型参数为派生类自身类型?
确保ParseField的泛型参数T与派生类类型一致的解决方案
我们可以通过两种方式实现你的需求,要么约束泛型参数的绑定关系,要么通过扩展方法自动推断类型,以下是具体实现:
方法一:泛型抽象类绑定派生类类型
将抽象类改为泛型类,通过约束让泛型参数T固定为派生类本身,这样ParseField方法无需额外指定T,编译器会自动推断,且能保证T始终与派生类一致:
public abstract class Parsable<T> where T : Parsable<T> { public bool ParseField<TMember>(Expression<Func<T, TMember>> expression, string s) { // 这里的T就是当前派生类的类型,可安全处理成员表达式 return true; } } // 派生类继承时指定自身作为泛型参数 public class PurchaseOrder : Parsable<PurchaseOrder> { public int Field1 { get; set; } public int Field2 { get; set; } public int Field3 { get; set; } } // 使用方式完全符合你的预期,无需手动指定类型 PurchaseOrder po = new(); po.ParseField(x => x.Field1, "1"); po.ParseField(x => x.Field2, "2"); po.ParseField(x => x.Field3, "3");
这种方式在编译期就确保了类型安全,不会出现T与派生类不匹配的情况,是最直接的解决方案。
方法二:利用扩展方法自动推断类型
如果无法修改原抽象类的泛型结构,可以通过扩展方法封装,让T自动绑定到调用实例的类型:
public abstract class Parsable { // 将原方法改为内部实现,保留核心逻辑 protected bool ParseFieldInternal<T, TMember>(Expression<Func<T, TMember>> expression, string s) { // 原ParseField的实现逻辑 return true; } } public static class ParsableExtensions { public static bool ParseField<T, TMember>(this T instance, Expression<Func<T, TMember>> expression, string s) where T : Parsable { return instance.ParseFieldInternal<T, TMember>(expression, s); } } // 派生类写法保持不变 public class PurchaseOrder : Parsable { public int Field1 { get; set; } public int Field2 { get; set; } public int Field3 { get; set; } } // 使用方式和你的预期一致 PurchaseOrder po = new(); po.ParseField(x => x.Field1, "1"); po.ParseField(x => x.Field2, "2"); po.ParseField(x => x.Field3, "3");
扩展方法会根据调用的实例自动推断T的类型,确保表达式参数x始终是派生类类型,同时复用原方法的逻辑。
内容的提问来源于stack exchange,提问作者Jonathan Wood
相关产品推荐
相关产品推荐

