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");

提前谢谢。

c#中带有泛型类的泛型方法

ren的注释是正确的——你不能在这里推断出泛型参数的子集。

你可以做什么(假设你的方法Read不做任何泛型类型的M)是这样的:

interface IReadableFileAccess<J> { ... // methods that Read needs... }

FileAccessStateAccess实现IReadableFileAccess,将Read的签名改为:

J Read<J>(IFileAccess<J> access, String fileName,  ... whatever ...) { ... }

你可以传递一个StateAccess的实例,J是关闭的:

Read(someStateAccess, "fileName")

注意:上面的"Closed for J"意味着StateAccess不是J的泛型——J的类型是指定的,因此是可推断的。