5

可以像这样在 C# 中定义别名

using kvp = System.Collections.Generic.KeyValuePair<string, string>;

var pair = new kvp("key", "value");

微软也定义了别名:

        int i;
        Int32 i2;

我们如何定义命名空间中可用的别名?这是可配置的吗?


这个问题专门关于别名......所以......不希望使用继承作为代理。在许多情况下,我对此感到满意……但当您想要最好的描述性名称和速记版本时,情况就不是这样了。

4

2 回答 2

5

我不认为你所要求的真的是可能的。这是一种解决方法:包含一个名为 kvp 的类型,它是您的类型的副本KeyValuePair<string, string>并隐式转换为您的类型。

public struct kvp
{
    public string Key { get; private set; }
    public string Value { get; private set; }

    public kvp(string key, string value)
        : this()
    {
        Key = key;
        Value = value;
    }
    public override string ToString()
    {
        return ((KeyValuePair<string, string>)this).ToString();
    }

    public static implicit operator KeyValuePair<string, string>(kvp k)
    {
        return new KeyValuePair<string, string>(k.Key, k.Value);
    }
    public static implicit operator kvp(KeyValuePair<string, string> k)
    {
        return new kvp(k.Key, k.Value);
    }
}

这具有您可以使用kvp而不是 的KeyValuePair<string, string>效果,在大多数情况下不会产生意外影响。

如果您希望 typedef 的类型是一个未密封的类,您可以通过创建一个扩展它的类来做(非常接近)您想要的事情,其中​​所有基类的构造函数都被镜像和扩展base(...)

于 2012-06-24T12:13:04.993 回答
4

您明确要求提供别名而不是解决方法。因此,我唯一的答案是:没有办法做到这一点。

您作为示例提供的using别名是每个文件。C# 没有允许跨文件别名的构造。

于 2012-06-24T12:24:50.417 回答