C# 泛型类型 typedef/alias 和 InvalidCastException

标签 c# generics types alias

使用泛型类型的泛型类型变得可读性很差,所以我想创建一个更短的别名。例如:

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/

相关文章:

typescript - 检查变量是否属于具有相同属性的 Typescript 中的自定义类型

c++ - 模板类中引用的类型检查不那么严格吗?

c++ - OpenCV 上 SIFT 描述符的正确输出类型是什么?

typescript - 泛型函数子类型约束错误和混淆

java - Jackson 中的通用元组反序列化

C# 使用 Xamarin 导入 MySql

c# - 位图图像图像打开事件未在后台代理中触发

java - 打印数组中所有元素的通用方法

c# ToDictionary with ContainsKey 检查

c# - WPF 同步 ListBox 项目的大小