java - C# 中的多类泛型集合

标签 java c# generics wildcard

我需要一个类型安全的多类型集合,例如从通用标签类映射的映射 Tag<T>T 类型的对象。在 Java 中,我会写这样的东西:

class ClassMap {
    private HashMap<Tag<?>,?> map = new HashMap<>();

    <T> void put(Tag<T> tag, T value){
        map.put(tag,value);
    }

    <T> get(Tag<T> tag){
        return (T) map.get(tag);
    }
}

该集合是类型安全的,即强制转换 (T)总是会成功,因为集合会检查该类是否与插入时的标签相对应。

但是如何在 C# 中做到这一点呢? Afaik,C# 中没有通配符,所以我不能写 HashMap<Tag<?>,?>这里。如何告诉 C# 我需要一个通用映射,但无法准确指定其参数?

最佳答案

你试过这个吗? C# 的所有类均派生自 object

编辑:对象类引用 -

http://msdn.microsoft.com/en-us/library/system.object.aspx

您可以将任何对象类型转换为object类型 -

    class Tag<T>{

    }
    class ClassMap {
        private Dictionary<object, object> map = new Dictionary<object,object>();

        public void put<T>(Tag<T> tag, T value){
            map.Add(tag, value);
        }

        public T get<T>(Tag<T> tag){
            return (T)map[tag];
        }
    }
    public class Program
    {
        public static void Main(string[] args)
        {
            ClassMap v = new ClassMap();
            Tag<Int16> t = new Tag<short>();
            v.put<short>(t, 10);
            var tt = v.get<short>(t);
        }
    }

调试信息 -

enter image description here

关于java - C# 中的多类泛型集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24350495/

相关文章:

java - java集合中的entryset vs keyset

java - (Java) 使用 map 时,键和值具有相同的类型是否有意义?

generics - 在 Rust 中实现 len() 函数的类型的通用较长函数

go - 通用 slice 参数和限制为 slice 类型的参数有什么区别?

java - 卢恩。数字长度控制

java - 我无法让程序按顺序重复输出

c# - 在 ASP.NET Core 中,有没有办法从 Program.cs 设置中间件?

c# - 无法在我的 Asp.Net Core 项目中的帮助程序类中访问 Session 对象

c# - 处理参数

generics - 为什么 Rust 不允许强制转换容器内的特征对象?