c#中具有泛型类的通用方法

时间:2016-08-14 14:54:30

标签: c# generics methods abstract-class

我想知道是否有一种简单的方法可以简化创建采用通用抽象类的通用方法。 它看起来像这样:

public J Read<T, M, J>(string fileName) where T : FileAccess<M, J> where M : Accessor where J : new() {
        /*More Code... return J*/
    }

FileAccess类采用相同的通用&#34;参数&#34;。

public abstract class FileAccess<T, M> : IDisposable where T : Accessor where M : new() {/* More Code*/}

还有其他类实现这个抽象类。 e.g。

public class StateAccess : FileAccess<XMLAccessor, List<Data>> {/*More Code*/}

大多数时候,C#非常聪明,可以找出您正在使用的其他通用类型,因此您不必编写它们。我认为它会起作用,它最终将会是这样的:

Read<StateAccess>("state");

但是,这是我必须做的才能使其发挥作用:

Read<StateAccess, XMLAccessor, List<Data>>("state");

即使我已经创建了一个使用XMLAccessor和数据列表的类StateAccess。

Method Read将与从FileAccessor继承的其他类一起使用。 所以我的问题是:如何使我的代码工作,所以我最终得到了这个?

Read<StateAccess>("state");
Read<OtherAccess>("otherFileName");

先谢谢你。

1 个答案:

答案 0 :(得分:2)

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

注意:上面的“为J封闭”意味着StateAccess对于J来说不是通用的 - 指定了J的类型,因此可以推断。