Разбор примитивных типов на основе пользовательского ввода в c # - PullRequest
1 голос
/ 13 января 2011

Мой код для этого использует отражение и строки, которые я ему даю, вместо ввода пользователя.В конечном итоге я хотел бы, чтобы пользователь мог сказать «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 ]

4 голосов
/ 13 января 2011

Чтобы сделать то же самое без использования отражения:

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));
}
4 голосов
/ 13 января 2011

Но я продолжаю получать нулевое исключение от второй до последней строки.Что там происходит?

Ваш t.GetMethod не работает.Метод называется Parse, а не то, что вы написали.Это может больше не быть двусмысленным - но это только потому, что теперь он не находит метод и молча возвращает null.

Чтобы сделать вызов однозначным, вам нужно указать ожидаемые типы параметров:

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