泛型方法含泛型属性时抛出‘T未定义成员’错误的解决
解决泛型方法中T类型成员访问错误的方案
问题原因
将AddInfo改为泛型方法后,编译器无法确定泛型参数T包含emailrequetid成员——因为T被定义为任意类型,所以会抛出找不到该成员的错误。
解决方案
1. 定义公共接口
创建一个包含emailrequetid属性的接口,让所有需要传入SecureEmail<T>的T类型都实现这个接口:
public interface IHasEmailRequestId { string emailrequetid { get; set; } // 注意统一拼写,你的代码里存在`emailrequetid`/`emailrequstid`拼写不一致问题 }
2. 让Model类实现接口
修改emailforEmployees、EmailtoAdmins、TypeofEmail这些类,让它们实现上述接口:
public class emailforEmployees : IHasEmailRequestId { public string emailrequetid { get; set; } // 保留原有其他成员 } public class EmailtoAdmins : IHasEmailRequestId { public string emailrequetid { get; set; } // 保留原有其他成员 } public class TypeofEmail : IHasEmailRequestId { public string emailrequetid { get; set; } // 保留原有其他成员 }
3. 给泛型方法添加约束
修改AddInfo方法,给T加上接口约束,让编译器明确T一定包含emailrequetid成员:
private void AddInfo<T, U>(SecureEmail<T> email, SecureEmail<U> tempEmail) where T : IHasEmailRequestId { var emailtrail = new NotifyMe() { emailrequetid = email.Model.emailrequetid // 此处不再报错 }; }
4. 修正调用代码的类型错误
你的sendEmail方法存在类型不匹配问题:创建SecureEmail<emailforEmployees>实例后,却给Model赋值EmailtoAdmins类型对象,需修正为对应类型:
void sendEmail(SecureEmail<TypeofEmail> email) { var tempEmail = new SecureEmail<EmailtoAdmins>() { // 填充Email类的成员 }; tempEmail.Model = new EmailtoAdmins() { // 填充Model数据,包括emailrequetid }; AddInfo(email, tempEmail); // 泛型参数会自动推断为TypeofEmail和EmailtoAdmins }
额外提示
- 统一
emailrequetid的拼写,避免因拼写错误导致的隐藏问题。 - 如果
U类型也需要访问公共成员,可给U添加对应的接口约束。
内容的提问来源于stack exchange,提问作者Aman
相关产品推荐
相关产品推荐

