我正在尝试使用自定义异常类型执行一些序列化/反序列化。此类型的字段定义为:
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#中为数组类型定义别名?
答案 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全面的单元测试将确保如果有人更改别名类型,则所有反序列化代码仍然有效。