2016-07-28 5 views
-5

でキャストオブジェクトは、任意の助けに感謝....初心者のC# - 多くのランタイム

問題:実行時に適用される3つの異なる種類の 選択は、ローカル変数は、その結果に応じて、型に変換したいです。

例:私はStackOverflowの周りを見て、いくつかの良い例を見つけた

Object test; 

if (something == somethingElse) 
{ 
    test = VendorClass<VendorType> 
} 
else 
{ 
    test = OtherVendorClass<OtherVendorType> 
} 

、など

var newVar = (OtherVendorClass<OtherVendorType>)test; 

とただし

var newVar = test as OtherVendorClass<OtherVendorType>; 

、すべて私が見てきましたテスト変数スコープではなく、新しい変数をローカルに作成するだけです。

ありがとうございます。

+1

あなたがここで尋ねていることは、それほど明確ではありません。あなたはいくつかの詳細を追加できますか? –

+0

キャスト後に 'test'オブジェクトをどのように使うのでしょうか? – Fabio

+0

うわー....私は何か非常に間違っている投票を見て間違っていたように見えます。誰かが私が間違っている場所についてアドバイスしてくれますか?ありがとう – ma11achy

答えて

0

isキーワードを使用してオブジェクトの型チェックを行うことができます。

if (myObject is MyFirstType) 
{ 
    MyFirstType obj = (MyFirstType)myObject; 
    obj.MyFirstTypeMethod(); 
} 
else if (myObject is MySecondType) 
{ 
    MySecondTypeobj = (MySecondType)myObject; 
    obj.MySecondTypeMethod(); 
} 
+0

これはお勧めしません。実際にはオブジェクトを2回キャストしています。 'var foo = myObject as Foo;を試す方がずっと良いですし、' foo'がnullでないことをテストしてください。 –

+0

'obj =(MyFirstType)myObject'か' myObject as MyFirstType'のどちらにしても、それは望ましくない状況です。これは100%常時ルールではありませんが、強く型付けされたコードは私たちがどのタイプのものを扱っているのかをすでに知っているので、オブジェクトを調べてそのタイプが何であるかを知る必要はありません。 *実際の型を知る必要はありません - それが実装するインタフェースまたはそれが継承する基本クラスだけです。そして、実際のタイプを知らなくても、* known *型で作業できるという利点があります。 –

1

あなたは変数testの種類を変更する方法を求めているならば、答えは次のとおりです。

あなたがすることはできません。また、条件によっては、異なるタイプの変数を定義することもできません。

しかし、testのタイプを選ぶことができます。そのタイプは、入れたいすべてのオブジェクトに適しています。objectなどです。

object test; 
if (condition) 
    test = new VendorClass<VendorType>() 
else 
    test = new OtherVendorClass<OtherVendorType>() 

このコードは、唯一の問題は、あなたがtestに保存されたオブジェクトにアクセスするたびに、あなたは正しい型に戻ってそれをキャストする必要があること、であること、有効です。

if(condition) 
    ((VendorClass<VendorType>)test).vendorMethod(); 
else 
    ((OtherVendorClass<OtherVendorType>)test).vendorMethod(); 

よりエレガントな解決策を見つけるかobjectよりも、別の型を定義するために、だろう、それはすべてのこれらのタイプを保持するのに十分な一般的な、しかし、あなたがアクセスする必要のあるすべてのプロパティを持っているのに十分正確です。

VendorClass<T>OtherVendorClass<T>はどちらも継承していますが、この時点では継承のC#マニュアルを参照しています。 (https://msdn.microsoft.com/en-us/library/ms173149.aspx

EDIT:このようなタイプは、両方のタイプが実装されているInterfaceでもかまいません。 (https://msdn.microsoft.com/en-us/library/ms173156.aspx

また、C#マニュアルよりも優れたリソースを投稿することができます。そこにはC#の継承とインターフェイスについてのより良い説明があります。

1

変数を宣言すると、その変数にあるタイプ、別のタイプ、または他のタイプのオブジェクトが含まれている可能性があるという問題があります。次にそのオブジェクトで何をするつもりですか?強く型付けされた言語の全体のポイントは、私たちが作業している各オブジェクトの型を知っているか、少なくともその型について何かを知っていることです。私はそれは良い習慣だとは言わないよ

ISomeCommonInterface myObject = null; 

if(something == true) 
    myObject = new SomethingThatImplementsThatCommonInterface(); 
else 
    myObject = new SomethingElseThatImplementsThatCommonInterface(); 

が、それは動作します。これらの様々な種類がすべてのいくつかの共通のインターフェースを実装する場合

あなたはこれを行うことができます。今後は、myObjectISomeCommonInterfaceのインスタンスであることがわかります。だからあなたはそのインタフェースを扱い、実際の実装が何であるかはもう気にしません。

(も種類が宣言された型から継承した場合に動作、または1つが宣言された型で、他の人が継承すること。)

そうでなければあなたができるすべての種類objectとして、あなたの変数を宣言しています。これで、任意のタイプを割り当てることができますが、強いタイピングの目的に反します。私たちはいつも、既知の所定の型としてオブジェクトをキャストして、それを使用する方法やそれとやり取りする方法を知りたいと思っています。我々はobjectを持っていることを決して望んでいないし、 "この型の場合はこのメソッドを呼び出しますが、その型ならそのメソッドを呼び出します。

+0

ありがとう!私はしないことを学んだ:) – ma11achy

+1

あなたは大歓迎です!一般的な経験則として、変数を 'オブジェクト 'として宣言している場合、またはオブジェクトを持っていて、その型が何であるかを調べるためのコードを記述している場合、何かが間違っています。 (どちらも絶対的なものではありませんが、彼らはあなたを遠くにつかまえます)。 –