- PR -

キャストについて

1
投稿者投稿内容
のりてる
会議室デビュー日: 2006/06/10
投稿数: 9
投稿日時: 2008-03-18 18:37
以下のコード中(コードは簡略化しています。)において@とAは可能でしょうか?

環境:VS2005(C#2.0)



コード:
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main( string[] args ) {
            object objValue = (double)1.23;

            //  :

            /// @ objValueだけを頼りに、double型変数を作りたい。
            double calc;

            /// A objValueだけを頼りに、()演算子を用いて、キャストしたい。
            calc = (double)objValue;

        }
    }
}




やりたいことは、
格納される値にはint値やbool値やdouble値などが含まれるDictionary<string, object>のような辞書を定義し、
値格納フェーズにおいて、
items.Add("voltmeter", (double)1.23);
とし、
値を取り出すときには、
items["voltmeter"]としたときに、これは何型なのかを知りたいということです。

以上、宜しくお願いします。
masa
大ベテラン
会議室デビュー日: 2004/10/28
投稿数: 161
投稿日時: 2008-03-18 18:45
あらかじめ型が絞れる(かつそれほど数がない)のであれば、
typeof で聞いてみるというのはどうでしょうか。

if ( typeof obj is int ) {
 int i = (int)obj;
} else if ( typeof obj is double ) {
 double d = (double)obj;
}
otf
ベテラン
会議室デビュー日: 2006/08/04
投稿数: 91
投稿日時: 2008-03-18 18:45
http://msdn2.microsoft.com/ja-jp/library/system.object.gettype(VS.80).aspx
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-03-18 18:45
GetType とか TypeOf とか is とか as とか?


変数は作れないだろうなぁ?いや、あなたの思いと私の思いが一致しているかどうかわからないけど。
のりてる
会議室デビュー日: 2006/06/10
投稿数: 9
投稿日時: 2008-03-18 21:53
引用:

if( typeof obj is int ){
int i = (int)obj;
} else if ( typeof obj is double ) {
double d = (double)obj;
}


int iやdouble dの変数を、if文スコープの外で定義したいのです。
つまり、objが示す型の変数をあらかじめ作っておきたいのです。



引用:

変数は作れないだろうなぁ?いや、あなたの思いと私の思いが一致しているかどうかわからないけど。


私がやりたいことのヒントが得られるかわかりませんが
さしつかえがなければ、Jittaさんの思いというのを教えていただけませんでしょうか?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-03-18 22:15
引用:

のりてるさんの書き込み (2008-03-18 21:53) より:
引用:

変数は作れないだろうなぁ?いや、あなたの思いと私の思いが一致しているかどうかわからないけど。


私がやりたいことのヒントが得られるかわかりませんが
さしつかえがなければ、Jittaさんの思いというのを教えていただけませんでしょうか?


あ、いや、質問の意図と私の理解が一致しているか、ということです。
引用:

int iやdouble dの変数を、if文スコープの外で定義したいのです。
つまり、objが示す型の変数をあらかじめ作っておきたいのです。


こんな感じ?
コード:

(言わなくてもわかると思うけど、このコードは動かないよ)
SomeFunction() {
union {
int iHoge;
double dHoge;
string sHoge;
};
if (typeof obj is int) {
iHoge = (int) obj;
} else if (typeof obj is double) {
dHoge = (double) obj;
} ....
}



 で、実際にどうするか、ですが、結局その型以外の変数は使わないのですから、if ブロック内にスコープを納めてもいいのでは?

 あるいは、実際の処理はもう一段別のメソッドをかまし、そのメソッドではオーバーロードを利用してそれぞれの型用の処理をする、とか。GoF のパターンにありそうだけど。

[ メッセージ編集済み 編集者: Jitta 編集日時 2008-03-18 22:16 ]
otf
ベテラン
会議室デビュー日: 2006/08/04
投稿数: 91
投稿日時: 2008-03-18 22:22
引用:

のりてるさんの書き込み (2008-03-18 21:53) より:
int iやdouble dの変数を、if文スコープの外で定義したいのです。
つまり、objが示す型の変数をあらかじめ作っておきたいのです。


コンパイル時にわかることはそれがobject型であるということだけなので
それ以上のことはできません。
isやらGetTypeは実行時なので無理です。

考えられる解決策はオブジェクト指向のポリモーフィズムです。
問題は取得してきた値に対してどのような操作をするかですが・・・。
masa
大ベテラン
会議室デビュー日: 2004/10/28
投稿数: 161
投稿日時: 2008-03-19 09:00

KeyDown イベントでは、押されたキーによって処理を行なったとき、
イベントデータの Handled に true をセットしますよね。

何かの処理を行うために型の特定を行いたいということでしたら、
それと同じ要領で

「指定されたオブジェクトの型が自分が処理対象とする型だったら処理を行う
 処理を行った場合は処理済であることを意味するフラグを立てる」

ようなインスタンスなりデリゲートなりを持たせるというのはどうでしょう。

1

スキルアップ/キャリアアップ(JOB@IT)