質問

これを行う私のコードは、ユーザー入力の代わりに、私がそれを与える反射と文字列を使用します。最終的に、ユーザーに「フロート」「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));
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top