固定数组作为参数

时间:2011-07-05 21:15:35

标签: c#

我有一个以数组作为参数的Web服务。问题是我只想让用户向我发送一个包含15个条目的数组。当然,如果他们给我发了一个更大的阵列,我可以编写代码只采取前15,但我不想这样做。我想让用户了解我们需要15个条目,只有15个条目,而不是更多。

我知道将数组初始化为固定值的唯一方法是实例化它,我不能将其作为参数。

也许作为参数的数组不是最佳选择?任何想法?

6 个答案:

答案 0 :(得分:9)

您无法真正控制操作输入的数组长度,但可以添加一些动态验证(例如,如果用户传递不同长度的数组,则抛出ArgumentException)。另一个选择是简单地为你的操作提供15个参数,但是如果参数是相关的并且数组更有意义,那么这可能不太可读。

答案 1 :(得分:2)

在服务的WSDL / XSD中,您可以指定15的minOccursmaxOccurs。如:

<xsd:element name="item" minOccurs="15" maxOccurs="15"> 
   <xsd:complexType> 
      ...
   </xsd:complexType>
</xsd:element>

答案 2 :(得分:1)

如果数组大小不正确,可能会抛出ArgumentException。

答案 3 :(得分:1)

这里唯一的语言功能是

1。参数列表

public void Foo<T>(T t1, T t2, T t3, T t4, T t5, T t6, T t7, T t8, T t9, T t10, T t11, T t12, T t13, T t14, T t15)
{
    internalFoo(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15);
}


private void internalFoo(params T[] arr)
{
    // profit
}

2。结构为Parameter Object Pattern

struct FooParams<T>
{
    public T t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15; 
}

public void Foo<T>(FooParams<T> fooParams)
{
    // profit
}

3。 C# 4.0 Tuples,您将使用Tuple<...,Rest>声明样式嵌套元组,因为框架库只会转到8元组(八元组?)

答案 4 :(得分:0)

你可以提供webservice功能的描述,让用户知道只考虑15个元素,如果use试图压倒那个限制,抛出参数异常或你自己的自定义异常...... 否则无其他办法。

答案 5 :(得分:0)

你可以使用Contract.Requires(arg.Length==15)并希望静态检查器能够很好地捕获用户错误。

或者您可以创建一个包装其拥有的数组的类。由于该类拥有并创建了数组,因此可以控制其大小。

在大多数情况下,我更喜欢第一种方式。有时你必须忍受运行时错误。