使用泛型类型的泛型类型变得可读性很差,所以我想创建一个更短的别名。例如:
1)在本例中通过子类化。
public class Parameters : Dictionary<string, string> {};
对我来说这实际上只是一个别名,所以在某些时候我想做:
var myDictionary = new Dictionary<string, string>;
// some operations on myDictionary
Parameters parameters = (Parameters)myDictionary;
在那里我得到了一个 InvalidCastOperation,我想是因为我想从基类转换为继承类(我的“技巧”来获取别名)。
不幸的是,这也不能挽救局面:
public class Parameters : Dictionary<string, string>
{
public static implicit operator Parameters(Dictionary<string, string> dict)
{
Parameters res = new Parameters();
foreach (var parameter in dict)
res.Add(parameter.Key, parameter.Value);
return res;
}
};
无法编译。所以这看起来像是一个死胡同。
我也许可以编写自己的方法,我必须显式调用该方法,但隐式转换会更好。
2)或者,我可以在文件级别上删除:
using Parameters = System.Collections.Generic.Dictionary<string, string>;
这有一个缺点,我需要为每个要使用该类型(或使用完整语法)的文件声明它。
如何获得具有隐式转换且只需要声明一次的别名?
编辑/添加
为了更好地理解,这是实际的代码。
public delegate Parameters UrlHandler(Parameters jsonParameters);
public class RequestHandlers : Dictionary<string, UrlHandler> { };
public class Parameters : Dictionary<string, string> { };
当我在 2 个参数之间执行 Linq-union 时,问题就出现了,这会生成一个字典。
最佳答案
在正常情况下,我不认为使用别名是一个好的做法。我相信它会降低代码的可读性。但是,如果您认为在您的特定情况下它会使代码更具可读性,或如果您认为 Parameters
可能不仅仅是一本字典,您可以继承 Dictionary<string,string>
并使用它的复制构造函数:
public class Parameters : Dictionary<string, string>
{
public Parameters(IDictionary<string, string> dict) : base(dict)
{
}
};
这将允许您执行以下操作:
var myDictionary = new Dictionary<string, string>();
Parameters parameters = new Parameters(myDictionary);
还有这个:
Dictionary<string, string> dictionary = parameters;
关于C# 泛型类型 typedef/alias 和 InvalidCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33279308/