C# - 字典,我可以在构造函数中设置值的类型吗? .NET 2.0

C# - Dictionary, Can i set type of value in constructor? .NET 2.0

有什么办法可以达到这样的目的吗?我发现动态可以解决,但它来自 .NET 4.0+ :/

 public class Message
        {
            public int ID;
            Dictionary<dynamic, dynamic> dict

            public Message(int ID, Dictionary<dynamic, dynamic> Data)
            {
                this.ID = ID;
                dict = Data
            }
        }

原因是因为有时我想要带有 string:string 的字典,有时需要带有 string:int 的字典,所以我想让这个 class 有点动态而不是 2 class es.

如果您的词典一次可以容纳一个,而另一个可以容纳另一个,那么它实际上应该是两本不同的词典。这与 SOLID-principle 一致,意味着任何 class 甚至 class 的任何成员都服务于 一个单一的 目的。让一个对象执行场景 1 中的操作而在场景 2 中执行不同的操作通常是一个错误的设计,您应该考虑创建两个不同的东西。

或者使用泛型,这是 Dictionary<T, U> 你必须将 TU 传递给你的 Message-class:

public class Message<T, U>
{
    public int ID;
    private readonly Dictionary<T, U> dict;

    public Message(int ID, Dictionary<T, U> Data)
    {
        this.ID = ID;
        dict = Data;
    }
}

现在您可以创建这样的实例:

var myDict = new Dictionary<string, string>();
var m = new Message<string, string>(0, myDict);

这将根据您对 myDict 的定义自动推断 TU 的正确类型。

您需要使用泛型

 public class MyClass<T>
    {
         private readonly Dictionary<string, T> _data;

        public MyClass( Dictionary<string, T> newData)
        {
            _data = newData;
        }

        public Dictionary<string, T> Data
        {
            get { return _data;}
        }

    }

最好的方法是创建一个通用的工厂方法,这样您甚至不必为用户增加类型负担:

public static class MessageFactory
{
    public static Message<TKey, TValue> Create<TKey, TValue>(int ID, IDictionary<TKey, TValue> data) 
        => new Message<TKey, TValue>(ID, data);

    public class Message<TKey, TValue>
    {
        public Message(int ID, IDictionary<TKey, TValue> data) { ... }
    }
}

现在用法与您的 dynamic 解决方案几乎相同,但更安全:

var message = MessageFactory.Create(1, someDictionary);

类型推断将负责计算出 TKeyTValue 的类型。

P.S。使 Message<,> 嵌套或不嵌套完全是可选的。我喜欢这种方式,以便尽可能地整理命名空间。