Анализ примитивных типах, основанный на вводе пользователя в C#

StackOverflow https://stackoverflow.com/questions/4682910

Вопрос

Мой код для этого использует отражение и строки, которые я даю, вместо ввода пользователя. В конечном счете, я хотел бы, чтобы пользователь мог сказать «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));
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top