1

これを行うための私のコードは、ユーザー入力の代わりに、私が与えたリフレクションと文字列を使用します。最終的には、ユーザーが「float」「2.0」と言って、コンピューターに「float」または「bool」「abc」と言わせることができるようにしたいと思います。これは、聞いたブール値ではありません。

ユーザー入力を受け取り、それを「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番目の行でnull例外が発生し続けます。そこで何が起こっているのですか?

4

2 に答える 2

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));
}
于 2011-01-13T17:23:03.730 に答える
4

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

あなたはうまくいきt.GetMethodません。メソッドはParse、あなたが書いたものではなく、と呼ばれます。あいまいではなくなった可能性がありますが、これは、メソッドが見つからず、サイレントにを返すためnullです。

呼び出しを明確にするには、予想されるパラメータータイプを指定する必要があります。

MethodInfo mi = t.GetMethod("Parse", new Type[] { typeof(string) });
于 2011-01-13T17:12:39.447 に答える