4

objecttypeの単一の引数を取るメソッドを C# で実装していますSomeMethod(object argument)。さまざまなタイプの複数のオブジェクトのコレクションをこのメソッドに渡す必要があります。インターフェイスの制限により、メソッド シグネチャを変更できません。

オブジェクト配列、 を送ろうと思っていたのobject[] myArray = new object[2]ですが、できれば配列の各要素を強く型付けしたいです。たとえば、2 つのオブジェクトがあります。1 つは typeFooで、もう 1 つは ですBar。であり、でmyArray[0]あるFooと保証したい。myArray[1]Bar

どうすればいいですか?別のコレクション型や特別なクラスを作成する方が理にかなっていますか?

更新: すべての良い答え。Tuple は最も一般的な方法に見えますが、コメントで述べたように、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 であることを保証したい

は、あるタイプのオブジェクトのArrayコレクションです。したがって、これを保証することはできません。これを行う唯一の方法は、複合型 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 に答える