丢失的C#通用通配符<! - ? - >的解决方法是什么

时间:2013-11-26 16:54:46

标签: c# .net generics wildcard

在Java中,我可以声明一个方法:public boolean doSth(Cache<?> cache, CacheItem item){...}

public interface Cache<T> {
    public boolean Contains(T item);
}

public class CacheFilePath implements Cache<FilePathItem> {
    @Override
    public boolean Contains(FilePathItem item) {
        return false; // TODO
    }
}

public class ItemHandler {

    public boolean doSth(Cache<?> cache, CacheItem item){
        if(cache instanceof CacheHostName && item instanceof HostNameItem){
            CacheHostName c = (CacheHostName) cache;
            HostNameItem i = (HostNameItem) item;
            return check(c, i);
        }
        else if(cache instanceof CacheFilePath && item instanceof FilePathItem){
            CacheFilePath c = (CacheFilePath) cache;
            FilePathItem i = (FilePathItem) item;
            return check(c, i);
        }
        throw new RuntimeException("Invalid arguments  !!!");
    }

    private boolean check(Cache<HostNameItem> cache, HostNameItem item){
        return cache.Contains(item);
    }

    private boolean check(Cache<FilePathItem> cache, FilePathItem item){
        return cache.Contains(item);
    }
}

如何在C#中声明这样的方法?

1 个答案:

答案 0 :(得分:2)

您可以在方法上声明类型参数,如下所示:

public boolean doSth<T>(Cache<T> cache, CacheItem item){
    ...
}

或者使用非泛型基类或接口:

public interface ICache { ... }
public class Cache<T> : ICache { ... }

public boolean doSth(ICache cache, CacheItem item){
    ...
}