问题描述
|
我正在尝试使用自定义异常类型进行一些序列化/反序列化工作。此类型的字段定义为:
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[]));
为了适应将来可能更改此字段的类型,因此在别名定义中只需更改一次即可。但是,编译器在using ResourceMessageType = object[];
中的object
处停止,抱怨期望使用标识符。更改为Object[]
会有所帮助,但是这次括号以相同的错误消息突出显示。
有没有一种方法可以为c#中的数组类型定义别名?
解决方法
简而言之,您不能“别名”数组类型。
您可以通过将内容封装在ѭ6中来解决此问题,但这并不能回答您的问题。
更新:
根据ECMA标准,
使用别名指令:
using
标识符=名称空间或类型名称;
这显然没有说明允许使用数组的任何内容。
(有关如何定义名称空间或类型名称的信息,请参阅第100页。)
,您可以定义一个称为ResourceMessageParamsType的类(或结构),并定义隐式运算符,以进行与object []之间的转换。
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);
}
}
,我只是从System.Array派生我的类型。如果我正确地解释了这一点,那么您所描述的是一种非OO方法,就像您在普通C语言中使用的那样。
更新-我猜你不能继承System.Array。也许有办法解决。
,using ResourceMessageParamsType = System.Array;
并不是说我假装理解此“保护序列化代码以防止类定义可能发生的更改”。
接口将是一种更清洁的方法,您是否考虑过泛型?
IMO综合单元测试将确保,如果有人更改了别名类型,则所有反序列化代码仍然有效。