c#中带有泛型类的泛型方法
本文关键字:泛型方法 泛型类 | 更新日期: 2023-09-27 18:02:25
我想知道是否有一个简单的方法,我可以简化创建一个通用的方法,需要一个通用的抽象类。它看起来像这样:
public J Read<T, M, J>(string fileName) where T : FileAccess<M, J> where M : Accessor where J : new() {
/*More Code... return J*/
}
FileAccess类接受相同的泛型"参数"。
public abstract class FileAccess<T, M> : IDisposable where T : Accessor where M : new() {/* More Code*/}
还有其他类实现这个抽象类。例如
public class StateAccess : FileAccess<XMLAccessor, List<Data>> {/*More Code*/}
大多数情况下,c#足够聪明,可以找出你正在使用的其他泛型类型,所以你不必编写它们。我认为它的工作原理是一样的,它最终会像这样:
Read<StateAccess>("state");
但是为了使它工作,我必须这样做:
Read<StateAccess, XMLAccessor, List<Data>>("state");
尽管我已经创建了一个classstateaccess,它使用XMLAccessor和一个数据列表。
方法Read将与继承FileAccessor的其他类一起使用。所以我的问题是:我怎样才能使我的代码工作,使我最终得到这个?
Read<StateAccess>("state");
Read<OtherAccess>("otherFileName");
提前谢谢。
ren
你可以做什么(假设你的方法Read
不做任何泛型类型的M
)是这样的:
interface IReadableFileAccess<J> { ... // methods that Read needs... }
让FileAccess
或StateAccess
实现IReadableFileAccess
,将Read
的签名改为:
J Read<J>(IFileAccess<J> access, String fileName, ... whatever ...) { ... }
你可以传递一个StateAccess
的实例,J
是关闭的:
Read(someStateAccess, "fileName")
注意:上面的"Closed for J"意味着StateAccess不是J的泛型——J的类型是指定的,因此是可推断的。