1

在我正在进行的一个项目中,我经常使用复杂Dictionary的对象。通常,有很多声明,例如:

var d1 = new Dictionary<string, Dictionary<int, List<string>>>();
var d2 = new Dictionary<Tuple<string, string>, List<object>>();

在类型转换和传递参数之间,这很烦人。我想做的是这样的,使用虚构的关键字“typedel”:

typedel ListDict = Dictionary<string, Dictionary<int, List<string>>>();
typedel PolyDict = Dictionary<Tuple<string, string>, List<object>>();

var d1 = new ListDict();
var d2 = new PolyDict();

这样我就不需要Dictionary每次都输入长声明 - 所以我想要的是为类型名称定义速记缩写。我怎样才能以最简单的方式(使用最少的代码行)做到这一点?

4

3 回答 3

5
class MyData : Dictionary<string, Dictionary<int, List<string>>>
{

}

您也可以这样做,但您必须在每个使用 的文件中都这样做,这MyData可能不是最理想的。

using MyData = Dictionary<string, Dictionary<int, List<string>>>;
于 2012-07-27T00:37:59.557 回答
4

对于您想经常使用的“typedef”,您可以创建一个派生自适当基类的类,如@Ed S 的回答:

class MyData : Dictionary<string, Dictionary<int, List<string>>>
{   
}

但是,这与大多数人认为的 typedef 不同:您正在引入一种新类型,它对反射、运算符等具有影响typeofis区别对您来说可能很重要,也可能无关紧要,但它就在那里.

但是,在单个源文件中,您可以使用using子句的第二种形式来执行真正的 typedef:

using ListDict = Dictionary<string, Dictionary<int, List<string>>>();
using PolyDict = Dictionary<Tuple<string, string>, List<object>>();

在任何一种情况下,虽然使用“typedef”肯定会节省你的打字时间,但不要忽视在代码中明确说明类型的好处。这与这篇博文等文章推荐使用List<Foo>自定义版本的原因相同FooCollection : List<Foo>——使用显式泛型版本,您可以知道它是什么类型的集合,以及它公开了什么方法。

于 2012-07-27T00:41:43.397 回答
1

而且,只是为了笑...

    static Func<T> Magic<T>(Func<T> f) { return f; }
    static Func<T> Creator<T>() where T : new() { return () => new T(); }
    ...
    var ListDict = Magic(() => new Dictionary<string, Dictionary<int, List<string>>>());
    var PolyDict = Creator<Dictionary<Tuple<string, string>, List<object>>>();
    var d1 = ListDict();
    var d2 = PolyDict();
于 2012-07-27T01:00:13.357 回答