【问题标题】:C# Set of Objects Referenced by ClassC# 类引用的对象集
【发布时间】:2012-06-27 00:21:56
【问题描述】:

我想要的是由其类引用的对象的唯一集合或集合。该集合只能包含给定类的一个对象。以下是一些可能功能的示例:

class A;
class B;
class C;

A a = new A();
B b = new B();
C c = new C();

UnknownCollection<object> objects;
objects.Add(A, a);    // Add(key, value)
objects.Add(B, b);
objects.Add(C, c);
var something = objects[A]; // return a reference to 'a' using class A as a key

如果这些方面的东西尚不存在,是否有一种方法可以创建具有合理性能的东西?

【问题讨论】:

    标签: c# .net collections set


    【解决方案1】:

    听起来你真的想要一个 Dictionary&lt;Type, object&gt; 来填充:

    objects.Add(typeof(A), a);
    objects.Add(typeof(B), a);
    objects.Add(typeof(C), a);
    ...
    
    A a = (A) objects[typeof(A)];
    

    如果字典总是将一个类型映射到该类型的实例,您可以封装它,这样您就可以保持 API 干净。你总是知道强制转换会起作用,因为唯一可以添加到字典中的代码可以确保类型始终正确。

    编辑:啊哈——原来我是blogged about this back in 2008。

    【讨论】:

    • 我建议使用这种扩展方法以使其更容易正确填充:public static void Add&lt;TValue&gt;(this IDictionary&lt;Type, TValue&gt; self, TValue value) { self.Add(value.GetType(), value); }
    • @cdhowie:我会将它封装在一个单独的类型中,而不是让任何东西都得到它。
    • 是的,那将是首选.. 但是对于快速而肮脏的 hack,扩展方法总比没有好。 :)
    • 好极了,我有预感 Dictionary 会为我服务,但我不确定。
    • @JonSkeet 在您的博文中,您有public void Add&lt;T&gt;(T value) { dictionary.Add(typeof(T), value); }。这使得dict.Add&lt;Base&gt;(someDerived) 成为可能——这是故意的吗?
    【解决方案2】:

    您正在寻找Dictionary&lt;TKey, TValue&gt;,特别是类型作为键:

    Dictionary<Type, object> map = new Dictionary<Type, object>()
    {
        { typeof(A), a }
        { typeof(B), b }
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-24
      • 1970-01-01
      • 1970-01-01
      • 2011-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多