2011-01-13 13 views
1

これを行うためのコードでは、ユーザ入力ではなくリフレクションと文字列を使用しています。最終的に私は、ユーザーが "float" "2.0"と言うことができるようにしたいと思っていますし、コンピュータが言う、浮動小数点、または "bool" "abc"コンピュータが言うだろう、それは聞いたことがないブール値です。cでユーザ入力に基づいてプリミティブ型に解析する#

ユーザー入力を受け取り、 "string"から "System.String"、 "float"から "System.Single"などのプリミティブ型の名前に変換するだけで十分です。それはあまりにも素晴らしいだろう、それを行うための機能を知っている)

は、ここでは、コードです:

Console.WriteLine("1.0 => {0}", System.Single.Parse("1.0")); // this works fine. 

Type t = Type.GetType("System.Single");    // for parsing floats 
MethodInfo mi = t.GetMethod("System.Single.Parse"); // "ambiguous" if use "Parse" 
object[] parameters = new object[] { "1.0" }; 
float f = (float)(mi.Invoke(null, parameters));  // get null exception here. 
Console.WriteLine("Was succesfully parsed to: " + f); 

しかし、私は最後の行に2番目のヌル例外を取得しておきます。そこには何が起こっているのですか?

+0

なぜTryParseを使用しないのですか?私はそれがかなり単純化すると思う。 –

+0

リフレクションを使わずに** Single.Parse( "1.0")**を直接使用することはできません。 – Jeff

+0

@Chris:パースを試してみると、実際には面白いフラッグのb/cが複雑になります。 – user420667

答えて

4

しかし、私は最後の行の2番目にヌル例外が発生し続けます。そこには何が起こっているのですか?

t.GetMethodは機能しません。この方法は、あなたが書いたものではなく、Parseと呼ばれています。もはやあいまいではないかもしれませんが、それは今や方法が見つからずに黙ってnullを返すためです。

コールを明確にするために、あなたが期待されるパラメータの型を指定する必要があります。

MethodInfo mi = t.GetMethod("Parse", new Type[] { typeof(string) }); 
+0

そして勝者があります!ありがとう。 (私は、そのあいまいな構文解析文について面白かったと知っていましたが、それを理解できませんでした)。ありがとう。 – user420667

4

反射使用せずに同じことを行うには:無効なタイプの例外を避けるために

Console.WriteLine(Convert.ChangeType("42", Type.GetType("System.Int32"))); 
Console.WriteLine(Convert.ChangeType("42.123", Type.GetType("System.Single"))); 

を、あなたはできます:

string typeStr = "System.Single"; 

Type type = Type.GetType(typeStr); 

if (type != null) 
{ 
    Console.WriteLine(Convert.ChangeType("42", type)); 
} 
+0

素晴らしいそれは素敵で短いです。 – user420667

関連する問題