Анализ примитивных типах, основанный на вводе пользователя в C#
-
10-10-2019 - |
Вопрос
Мой код для этого использует отражение и строки, которые я даю, вместо ввода пользователя. В конечном счете, я хотел бы, чтобы пользователь мог сказать «float» «2.0» и попросил компьютера сказать: да, это поплавок, или «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);
Но я продолжаю получать нулевое исключение на второй -последней линии. Что там происходит?
Решение
Но я продолжаю получать нулевое исключение на второй -последней линии. Что там происходит?
Ваш 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));
}