1

我需要一本可以做到这一点的字典:

Dictionary properties = new Dictionary();
properties.Add<PhysicalLogic>(new Projectile(velocity));

// at a later point
PhysicalLogic logic = properties.Get<PhysicalLogic>();

我发现这篇文章与我想要的内容相似,但不完全一样。

Unity3D 用他们的GetComponent<>()方法做到这一点,所以应该是可能的: http: //docs.unity3d.com/Documentation/ScriptReference/GameObject.GetComponent.html (单击“JavaScript”下拉菜单查看 C# 版本)

4

2 回答 2

5

没有内置类可以做到这一点。

您可以通过包装 aDictionary<Type, object>并将结果转换为Get<T>()

public class TypedDictionary {
    private readonly Dictionary<Type, object> dict = new Dictionary<Type, object>();

    public void Add<T>(T item) {
        dict.Add(typeof(T), item);
    }

    public T Get<T>() { return (T) dict[typeof(T)]; }
}

请注意,这将根据它们的编译时类型添加项目,并且您将无法使用除了确切类型(与基本类型或可变可转换类型相反)之外的任何东西进行解析。

如果您想克服这些限制,请考虑使用像 Autofac 这样的完整 IoC 系统,它可以完成所有这些以及更多。

字典对此无能为力,因为类型可转换性不是等价关系。
例如,两者stringint都应该算作object,但这两种类型并不相等。

于 2013-06-26T02:30:29.823 回答
2

严格根据您的示例(即一种类型只能有一个条目),您可以通过两种方式实现:

自定义词典

public class TypedDictionary : Dictionary<Type, object>
{
    public void Add<T>(T value)
    {
        var type = typeof (T);

        if (ContainsKey(type))
            this[type] = value;
        else
            Add(type, value);
    }

    public T Get<T>()
    {
        // Will throw KeyNotFoundException
        return (T) this[typeof (T)];
    }

    public bool TryGetValue<T>(out T value)
    {
        var type = typeof (T);
        object intermediateResult;

        if (TryGetValue(type, out intermediateResult))
        {
            value = (T) intermediateResult;
            return true;
        }

        value = default(T);
        return false;
    }
}

扩展方法

public static class TypedDictionaryExtension
{
    public static void Add<T>(this Dictionary<Type, object> dictionary, T value)
    {
        var type = typeof (T);

        if (dictionary.ContainsKey(type))
            dictionary[type] = value;
        else
            dictionary.Add(type, value);
    }

    public static T Get<T>(this Dictionary<Type, object> dictionary)
    {
        // Will throw KeyNotFoundException
        return (T) dictionary[typeof (T)];
    }

    public static bool TryGetValue<T>(this Dictionary<Type, object> dictionary, out T value)
    {
        var type = typeof (T);
        object intermediateResult;

        if (dictionary.TryGetValue(type, out intermediateResult))
        {
            value = (T) intermediateResult;
            return true;
        }

        value = default(T);
        return false;
    }
}

第一种方法更明确,因为另一种方法只需要特定类型的字典。

于 2013-06-26T02:36:38.183 回答