C# 继承接口实现泛型方法时无法访问参数类成员如何解决
问题原因
你代码中的SaveExistingData<Brand>里的Brand不是你预先定义的业务实体类,而是该方法的泛型参数占位符的命名,等同于你把常见的泛型占位符T改成了Brand,编译器无法识别这个占位符包含brandId等成员,因此抛出错误。同时你原有写法直接拼接brandId到SQL语句中存在SQL注入风险。
正确实现方案
推荐将泛型定义在接口层面,每个Adapter对应处理固定的实体类型,适配你的业务场景:
1. 修改接口定义
public interface IDataAdapter<T> { void SaveExistingData(T t); }
2. 重写BrandAdapter实现
public class BrandAdapter : IDataAdapter<Brand> { public void SaveExistingData(Brand updatedBrand) { // 改为全参数化写法,避免SQL注入风险,Dapper会自动匹配实体属性和SQL参数 string sql = "UPDATE tblBrands SET brandName=@brandName WHERE brandID=@brandId"; using (var connection = Helper.CreateDatabaseConnection()) { connection.Execute(sql, updatedBrand); } } }
3. 其余Adapter适配
剩余的ProductionAdapter、SupplyAdapter、OrderAdapter分别按照对应业务实体类实现对应泛型接口即可,例如ProductionAdapter写法:
public class ProductionAdapter : IDataAdapter<Production> { public void SaveExistingData(Production updatedProduction) { // 对应Production的业务逻辑 } }
内容的提问来源于stack exchange,提问作者Josh Ding
相关产品推荐
相关产品推荐

