2016-04-01 4 views
4

ジェネリックで動的にキャストしており、キャスト時に問題が発生しました。longからintです。問題は、基本的には次に沸く:オブジェクトインスタンスを使用して、longからintへジェネリックでキャストする

これは動作しますが:

long l = 10; 
int i = (int) l; 

これはしません:

long l = 10; 
object o = l; 
int i = (int)o; 

だから、問題は、私はタイプobjectの変数としてオブジェクトを持っているということですが、後ろのインスタンスはlongのタイプで、これをintにキャストしたいと考えています。これまでに私が見つけたのは、この記事です:Representation and identity (Eric Lippert)

だから何有効だろうことはこれです:

long l = 10; 
object o = l; 
int i = (int)(long)o; 

私は何をしようとしたことはこれです:

long l = 10; 
object o = l; 
int i = (int) Convert.ChangeType(o, typeof(long)); 

しかし、これは動作しません。今質問は、System.InvalidCastExceptionを使わずに動的にキャストする方法です。

現在、私は持っているがこれです(そしてそれは動作しません):

public T Parse<T>(object value){ 
    return (T) Convert.ChangeType(value, value.GetType()); 
} 

は、どのように私はそれが動作し、Tはintをbeeingてとタイプlongのオブジェクトを渡すことができるようにすることができます。

+1

私はそれを得ることはありません。あなたは、(オブジェクトを元のタイプにキャストして)動作する方法を見つけましたが、もっと複雑なやり方でそれをやりたいのですか?また、64ビット整数から32ビットへのデータ損失の可能性については心配していませんか? – user1666620

+0

ちょうど 'return(T)value; 'と言うことができません。 –

+0

@ChristophKnいいえ、InvalidCastExceptionがスローされます。 – Sjoerd222888

答えて

1

ルック:

long l = 10; 
object o = l; 
int i = (int) Convert.ChangeType(o, typeof(long)); 

それはあなたが欲しいものだとしてだけで、あなたにintを与えるConvertを頼む:

long l = 10; 
object o = l; 
int i = (int) Convert.ChangeType(o, typeof(int)); 

ConvertクラスでIConvertableインターフェイスを使用して変換を行います。

T Parse<T>(object value) 
{ 
    return (T) Convert.ChangeType(value, typeof(T)); 
} 

をそして、このようにそれを呼び出す:

あなたはこのようなあなたのParse関数を記述することができ、このアプローチを使用

long l = 10; 
object o = l; 
int i=Parse<int>(o); 
0

~intは型キャストです。これを行うと、あるタイプの値を別の同様のタイプに変更している場合があります。値の損失につながる場合もありますし、コンパイラはその方法を知っています。

object~intは型変換です。基になるタイプを変更しようとしています。したがって、runtimeエラーです。

は、あなたのlong値がintのために大きすぎる場合、あなたはまだそれに対処する必要がありますので、それはまだ失敗するこれはどう

return (T) TypeDescriptor.GetConverter(typeof(T)).ConvertFromString(value.ToString()); 

Casting and Type Conversion & Boxing & Unboxing

+0

実際のインスタンスの型が 'long'であっても、その型がわかりませんので、オブジェクトとして参照しています。質問はジェネリックキャスティングについてです。 – Sjoerd222888

関連する問題