C#のユーザー入力に基づいて、プリミティブタイプへの解析
-
10-10-2019 - |
質問
これを行う私のコードは、ユーザー入力の代わりに、私がそれを与える反射と文字列を使用します。最終的に、ユーザーに「フロート」「2.0」と言って、コンピューターにコンピューターが言う「ブール」「ABC」と言ってもらいたいと思います。
ユーザーの入力を取得して、「string」などのプリミティブタイプ名に「System.String」、「float」などのプリミティブタイプ名に変換するのに十分簡単です(ただし、関数を知っている場合それをするために、それも素晴らしいでしょう。)
これがコードです:
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番目から最後の行でヌル例外を取得し続けています。そこで何が起こっているのですか?
解決
しかし、私は2番目から最後の行でヌル例外を取得し続けています。そこで何が起こっているのですか?
あなたの t.GetMethod
うまくいきません。メソッドは呼び出されます Parse
, 、あなたが書いたものではありません。それはもはや曖昧ではないかもしれませんが、それは今では方法が見つからず、静かに戻るからです null
.
通話を明確にするには、予想されるパラメータータイプを指定する必要があります。
MethodInfo mi = t.GetMethod("Parse", new Type[] { typeof(string) });
他のヒント
反射を使用せずに同じことをすること:
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));
}
所属していません StackOverflow