如何访问泛型类中的变量?代码遇CS1061错误求助
解决CS1061错误:泛型类型中无法访问
type成员 嘿,我来帮你搞定这个CS1061错误!问题出在你的泛型类PicturePage<T>的Put方法里——当你写Console.WriteLine(item.type)时,编译器根本不知道T类型到底是什么,它无法确认所有T的实例都有type这个字段,所以就抛出了"“T”不包含“type”的定义,并且找不到可接受第一个“T”类型参数的可访问扩展方法“type”"的错误。
最佳解决方案:用接口约束泛型类型
如果所有要传入PicturePage<T>的类型都需要有type成员,最规范的做法是定义一个接口,让这些类型实现该接口,然后给泛型T加上约束。这样编译器就能明确知道T具备type成员,代码也更通用安全。
修改后的完整代码如下:
namespace Test { class Program { static void Main(string[] args) { LocalPage lp = new LocalPage(); lp.Put(); } } // 定义一个包含type成员的接口 public interface ITypeHolder { int type { get; } } // 让LocalDataFolder实现这个接口 public class LocalDataFolder : ITypeHolder { public LocalDataFolder() { } public int type; } // 给泛型T添加约束,限制为实现ITypeHolder的类型 public class PicturePage<T> where T : ITypeHolder { public List<T> folders = new List<T>() { }; public void Put() { foreach (T item in folders) Console.WriteLine(item.type); // 现在编译器能识别type成员了 } } public class LocalPage : PicturePage<LocalDataFolder> { public LocalPage() { folders.Add(new LocalDataFolder()); } } }
备选方案:强制类型转换(不推荐泛型场景)
如果你只是临时针对LocalDataFolder处理,不想用接口,也可以在Put方法里把item强制转换成LocalDataFolder。但这种方式会失去泛型的灵活性,而且如果传入其他类型会引发运行时错误,所以只适合临时测试:
public void Put() { foreach (T item in folders) { var localFolder = item as LocalDataFolder; if (localFolder != null) Console.WriteLine(localFolder.type); } }
推荐用第一种接口约束的方式,既能保证类型安全,又能让你的泛型类支持更多符合接口规范的类型。
内容的提问来源于stack exchange,提问作者BobZ
相关产品推荐
相关产品推荐

