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>
你必须将 T
和 U
传递给你的 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
的定义自动推断 T
和 U
的正确类型。
您需要使用泛型
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);
类型推断将负责计算出 TKey
和 TValue
的类型。
P.S。使 Message<,>
嵌套或不嵌套完全是可选的。我喜欢这种方式,以便尽可能地整理命名空间。
有什么办法可以达到这样的目的吗?我发现动态可以解决,但它来自 .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>
你必须将 T
和 U
传递给你的 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
的定义自动推断 T
和 U
的正确类型。
您需要使用泛型
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);
类型推断将负责计算出 TKey
和 TValue
的类型。
P.S。使 Message<,>
嵌套或不嵌套完全是可选的。我喜欢这种方式,以便尽可能地整理命名空间。