2011-02-10 8 views
1

誰でもこれを動作させる方法を説明できますか?私は型名を渡していて、 "t"は正しく入力されています。私はobjectToCastを型 "t"にキャストする方法を理解できません。どんな助けもありがとうございます。C#で型にキャストする方法

.... 
Type t = Type.GetType("castToTypeNameHere"); 
o = CastTo<t>(objectToCast); 
.... 

private T CastTo<T>(Object obj) 
{ 
    return (T)obj; 
} 

FYI、ここで私が見つけた答えだ:

Type t = Type.GetType(element.Attribute("castToType").Value); 
MethodInfo castMethod = this.GetType().GetMethod("CastTo", BindingFlags.Instance | BindingFlags.NonPublic).MakeGenericMethod(t); 
object castedObject = castMethod.Invoke(this, new object[] { objectToCast }); 
+1

o = CastTo (obj); '' o =(t)obj; 'を使うだけでいいのはなぜですか? –

+0

@Kieren: 't'は型名ではなく' Type'インスタンスであるため、与えられた例で 'CastTo (obj)'または '(t)obj'を使うことはできません。 – LukeH

+0

@Kieren、 '(t)obj;も' CastTo 'もできないので、質問してください。 –

答えて

7

あなたは(反射なし)ジェネリックを使用し、型パラメータは、タイプの名前、System.Typeのないインスタンスでなければなりません。 tは型の名前ではありませんので、だから、

Type t = Type.GetType("castToTypeNameHere"); 
o = CastTo<t>(objectToCast); 

を言うことはできません。あなたの代わりに

o = CastTo<int>(objectToCast); 

元の

o = CastTo<typeof(int)>(objectToCast); 

は後者が合法である、違法であると述べていたかのようです。

私はあなたが達成しようとしていることを理解していません。コンパイル時に型がわからない場合、そのようなキャストは役に立たない。コンパイラはoの型を認識せず、コンパイル時の型の安全性やIntelliSenseの機能を取得しません。

1

汎用タイプのパラメータには変数を使用できません(例:CastTo<t>)。実際のタイプ名(e.g., CastTo<string>)でなければなりません。

0

おそらくConvert.ChangeTypeがお手伝いします。あなたが考える場合は

Type t = Type.GetType("castToTypeNameHere"); 

//using dynamic 
dynamic obj = Convert.ChangeType(objectToCast, t); 
obj.SomeExpectedMethod(); 

//casting to known interface 
var obj = Convert.ChangeType(objectToCast, t) as IKnowWhatImSupposedToBe; 
if (obj == null) HandleBadState(); 
0

はあなたを言った答えが見つかりました:

は実際に何かを
Type t = Type.GetType(element.Attribute("castToType").Value); 
MethodInfo castMethod = this.GetType().GetMethod("CastTo", BindingFlags.Instance | BindingFlags.NonPublic).MakeGenericMethod(t); 
object castedObject = castMethod.Invoke(this, new object[] { objectToCast }); 

、あなたはどのような鋳造手段を理解していません。

コンパイル時のタイプはまだobjectなので、何も得られていません。直接objectのようなものを直接キャストできます。

キャスティングはオブジェクトのタイプを変更するものではなく、コンパイラがどのタイプのものかを知っていることをコンパイラに伝えるだけです。もしあなたが間違っていてもエラーは起こりますが、コンパイル時ではなくInvalidCastExceptionの実行時にのみ発生します。

コンパイル時に知られていない型にキャストするだけでは意味がありません。たとえ仮説を立てても、それはあなたに何を与えるでしょうか?

Type someType = Type.GetType("castToTypeNameHere"); 
someType o = CastTo<someType>(objectToCast); 

oにはどのような方法がありますか? someTypeは何でもかまいませんので、コンパイラはそれが持っているもののメソッドやプロパティを知ることができる方法はありませんあなたは、あなたが持つことができませんでしたsomeTypeで行うことができます何もないので、それは

object o = (object)objectToCast

とまったく同じになりますobject

関連する問題