2011-04-13 57 views
6

我想用自定义的异常类型做一些序列化/反序列化的东西。这种类型有一个字段定义为:是否有可能在c#中别名数组类型?

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#中定义数组类型的别名?

+2

一般性评论:在您的类型名称中加入'Type'是多余的,通常是不正确的形式。 – 2011-04-13 21:45:02

回答

3

简而言之,你不能“别名”数组类型。

你可以通过封装struct来解决这个问题,但这并不能解决你的问题。


更新:

从ECMA标准,

使用别名指示:

using标识符 = 命名空间或类型 - 名称;

这显然没有提及任何有关数组被允许的内容。

(请参阅如何命名空间或类型名字定义100页。)

+0

谢谢你回答所问的问题。你有证据链接吗? – 2011-04-13 21:52:09

+0

@斯坦尼斯拉夫:你不能真正“证明”一些不存在的东西,除非你看到所有的可能性并将它们全部排除在外。如果你想要一个严格的证明,那么你必须阅读[ECMA标准](http://www.ecma-international.org/publications/standards/Ecma-334.htm),并看到没有这样做的方式,因此这是不可能的,否则,你将不得不“听我说”。 :) – Mehrdad 2011-04-13 21:54:02

+0

是的,我想你可能有一个标准的特定段落,禁止别名数组类型。让我们等待Jon Skeet回答,他知道标准的内心。 – 2011-04-13 21:58:34

0

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

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

+0

好吧,它可能不是一个经典的面向对象的方法,但是有一种语言特征用于别名类型,“使用MyType = SomeLongNameSpace.SomeType;”会工作得很好,但不适用于数组。我想要的是保护序列化代码免受类定义中的可能更改。 – 2011-04-13 21:35:42

7

您可以定义一个名为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

是不是'隐式'意思是“明确的”? – 2014-05-09 14:34:57

0
using ResourceMessageParamsType = System.Array; 

这并不是说我假装理解如何“维护[S]对类可能发生的变化序列化代码定义“为你。

接口将是一个更清洁的方法,你有没有考虑泛型?

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

相关问题