3

C#、オブジェクトを再キャストし、新しいオブジェクト変数を作成せずにメソッドとプロパティにアクセスすることは可能ですか?

例えば:

foreach (object o in collection)
{
    if (o is MyType)
        {
            (MyType)o.MyProperty = x
        }
 }

現在、MyType のメソッドまたはプロパティにアクセスするには、o を MyType の別の変数 [例: MyType m = (MyType)o ] に再キャストする必要があります。無駄に思えるので、新しいオブジェクト変数の宣言をスキップできるメカニズムが欠けているのではないかと思っています。

4

5 に答える 5

4

.キャストよりも優先順位が高いため、コードは機能しません。したがって、括弧を追加する必要があります。

foreach (object o in collection) 
{ 
    if (o is MyType) 
        { 
            ((MyType)o).MyProperty = x; 
        } 
 } 
于 2012-08-26T16:57:11.097 に答える
3

Linq を使用できます。

foreach(MyType t in collection.OfType<MyType>()) {}

ダイレクト キャストを使用することもできます。

foreach(object o in collection)
{
    if(o is MyType)
    {
        ((MyType)o).MyProperty = x;
    }
}

または、知っている場合、または確認したい場合 (InvalidCastExceptionコレクションが混合タイプの場合に可能になることに注意してください)、CastLinq メソッドを使用できます。

// If your collection is all of the same type
foreach(MyType t in collection.Cast<MyType>()) {}
于 2012-08-26T16:54:53.850 に答える
2

2組の括弧が必要です。

((MyType)o).MyProperty = x;

それ以外の場合、キャストは式全体に適用されます。


y = (MyType)o.MyMethod(x);

と同じです

y = (MyType)(o.MyMethod(x));

これはあなたが望むものではありません(それはの結果をキャストしますMyMethod)。代わりに書く

y = ((MyType)o).MyMethod(x);
于 2012-08-26T17:00:39.167 に答える
0

インターフェイスを実装する

interface MyInterface
{
 string MyProperty;
}

foreach(object o in collection)
{
MyInterface o= originalObject as MyInterface

if (MyInterface!= null)

  ((MyInterface)o).MyProperty = x;
}
于 2012-08-26T17:01:01.957 に答える
0

はい、キャストできます

foreach(var t in collection.Cast<YourType>())
{
  t.MyProperty = x;
}

注 : ただし、参照型から値型に、または値型から参照型に渡す場合、ボックス化またはボックス化解除操作はメモリ内でコストのかかる操作であることを知っておく必要があります。

この場合、この制約はありません。

于 2012-08-26T16:56:44.703 に答える