是否可以在c#中使用别名数组类型?

时间:2011-04-13 21:22:52

标签: c# arrays types alias

我正在尝试使用自定义异常类型执行一些序列化/反序列化。此类型的字段定义为:

private object[] resourceMessageParams;

我已经获得了所有漂亮且强类型的代码以及一些Linq表达式魔法,但是我想要比这更进一步并做这样的事情:

using ResourceMessageParamsType = object[];//<-- "Identifier expected" error here
/*...*/
private ResourceMessageParamsType resourceMessageParams;
/*...*/
this.resourceMessageParams = 
    (ResourceMessageParamsType)serializationInfo.GetValue(
        ReflectionHelper.GetPropertyNameFromExpression(() => 
            resourceMessageParams), typeof(ResourceMessageParamsType));

而不是:

(object[])serializationInfo.GetValue(
    ReflectionHelper.GetPropertyNameFromExpression(() => 
        resourceMessageParams), typeof(object[]));

为了适应将来可能更改此字段的类型,因此必须在别名定义中仅更改一次类型。但是,编译器在object using ResourceMessageType = object[];停止抱怨标识符是预期的。更改为Object[]会有所帮助,但这次使用相同的错误消息突出显示括号。

有没有办法在c#中为数组类型定义别名?

4 个答案:

答案 0 :(得分:8)

您可以定义一个名为ResourceMessageParamsType的类(或结构),并定义用于向对象[]进行转换的隐式运算符。

struct ResourceMessageParamsType
{
    private object[] value;

    private ResourceMessageParamsType(object[] value)
    {
        this.value = value;
    }

    public static implicit operator object[](ResourceMessageParamsType t)
    {
        return t.value;
    }

    public static implicit operator ResourceMessageParamsType(object[] value)
    {
        return new ResourceMessageParamsType(value);
    }
}

答案 1 :(得分:3)

简单地说,你不能“别名”数组类型。

您可以通过将内容封装在struct中来解决此问题,但这不能解答您的问题。


<强>更新

根据ECMA标准,

  

使用别名指令:

     

using 标识符 = namespace-or-type-name ;

显然没有说明允许数组的任何内容。

(有关如何定义 namespace-or-type-name ,请参阅第100页。)

答案 2 :(得分:0)

我只是从System.Array派生我的类型。如果我正确地解释这个你所描述的是一种非OO方法,就像你在普通C中使用的那样。

更新 - 我猜你不能继承System.Array。也许有办法解决它。

答案 3 :(得分:0)

using ResourceMessageParamsType = System.Array;

并非我假装了解这个“保护[s]序列化代码如何防止类定义中的可能更改”。

接口是一种更简洁的方法,您是否考虑过泛型?

IMO全面的单元测试将确保如果有人更改别名类型,则所有反序列化代码仍然有效。