4

我在 C# 中实现了一个方法,它接受一个类型的参数object,例如SomeMethod(object argument). 我需要将不同类型的多个对象的集合传递给此方法。由于接口限制,我无法更改方法签名。

我正在考虑发送一个对象数组,object[] myArray = new object[2]但如果可能的话,我想强烈键入数组的每个元素。例如,我有两个对象,一个是 type Foo,另一个是Bar. 我想保证myArray[0]isFoomyArray[1]is Bar

我该怎么做?另一个集合类型或创建一个特殊类会更有意义吗?

更新:所有好的答案。元组看起来是最通用的方式,但正如我在评论中所说,我仅限于 3.5。结构可以工作,但是在对使用结构和类作为参数进行了一些研究之后,如果使用更大的结构,性能会受到轻微影响。(来源- 请参阅基准部分)。所以我要去上课。谢谢你们!

4

4 回答 4

2

在集合中安全地存储一组不相关类型的唯一方法是使用中间类型,它将值限制为这些类型并将该类型存储在集合中。这是一个穷人受歧视的结合。

sealed class FooOrBar {
  public readonly Foo Foo;
  public readonly Bar Bar;
  public bool IsFoo { 
    get { return Foo != null; }
  }
  public bool IsBar {
    get { return Bar != null; }
  }
  public FooOrBar(Foo f) {
    Foo = f;
  }
  public FooOrBar(Bar b) {
    Bar = b;
  }
  public static implicit operator FooOrBar(Foo f) {
    return new FooOrBar(f);
  }
  public static implicit operator FooOrBar(Bar b) {
    return new FooOrBar(b);
  }
}

FooOrBar[] array = new FooOrBar[2];
array[0] = new Foo();
array[1] = new Bar();
array[2] = "test";  // Fails to compile
于 2012-04-26T16:52:52.437 回答
2

我想保证 myArray[0] 是 Foo 并且 myArray[1] 是 Bar

AnArray是某种类型的对象的集合。所以你不能保证这一点。这样做的唯一方法是创建一个复合类型 astruct或 a class

但是,如果您的签名SomeMethod(object argument)是固定的,您仍然无法在该方法中静态地保证这一点。您能做的最好的事情是在外部确保您传递的参数类型正确。

于 2012-04-26T16:54:46.240 回答
1

创建一个反映您需要的类或结构

public class FooBar
{
    public Foo Foo { get; set; }
    public Bar Bar { get; set; }
}

然后像这样调用你的方法

SomeMethod(new FooBar { Foo = foo, Bar = bar });

像这样实现它

public SomeMethod(object argument)
{
    var fooBar = argument as FooBar;
    if (fooBar != null) {
        Foo foo = fooBar.Foo;
        Bar bar = fooBar.Bar;
        ...
    }
}
于 2012-04-26T16:59:11.560 回答
1

使用 可能会更好Tuple<>,例如:

Foo foo = new Foo();
Bar bar = new Bar();
Tuple<Foo, Bar> fooBar = new Tuple(foo, bar);
SomeMethod(fooBar);

但是如果没有关于您的代码的更多信息,很难判断它是否比object[].

于 2012-04-26T17:08:22.367 回答