Получение .Net соответствующего типа типа C # через отражение - PullRequest
2 голосов
/ 22 сентября 2009

есть ли функция, которая, учитывая строковое представление типа C #, возвращает соответствующий строковое представление типа .Net или .Net; или любой другой способ добиться этого.

Например:

"bool" -> System.Boolean или "System.Boolean"

"int" -> System.Int32 или "System.Int32"

...

Спасибо.

Редактирование: действительно извините, это не отображение типа "тип", которое мне нужно, а отображение "строка в строку" или отображение "строка в тип".

Ответы [ 3 ]

6 голосов
/ 22 сентября 2009

Список встроенных типов в C # довольно короткий и вряд ли изменится, поэтому я думаю, что наличие словаря или большого оператора switch для их отображения не должно быть сложным поддерживать.

Если вы хотите поддерживать обнуляемые типы, я полагаю, что у вас нет другого выбора, кроме анализа входной строки:

static Type GetTypeFromNullableAlias(string name)
{
    if (name.EndsWith("?"))
        return typeof(Nullable<>).MakeGenericType(
            GetTypeFromAlias(name.Substring(0, name.Length - 1)));
    else
        return GetTypeFromAlias(name);
}

static Type GetTypeFromAlias(string name)
{
    switch (name)
    {
        case "bool": return typeof(System.Boolean);
        case "byte": return typeof(System.Byte);
        case "sbyte": return typeof(System.SByte);
        case "char": return typeof(System.Char);
        case "decimal": return typeof(System.Decimal);
        case "double": return typeof(System.Double);
        case "float": return typeof(System.Single);
        case "int": return typeof(System.Int32);
        case "uint": return typeof(System.UInt32);
        case "long": return typeof(System.Int64);
        case "ulong": return typeof(System.UInt64);
        case "object": return typeof(System.Object);
        case "short": return typeof(System.Int16);
        case "ushort": return typeof(System.UInt16);
        case "string": return typeof(System.String);
        default: throw new ArgumentException();
    }
}

Тест:

GetTypeFromNullableAlias("int?").Equals(typeof(int?)); // true
3 голосов
/ 22 сентября 2009

Ваш вопрос не совсем понятен: я не уверен, какую форму вы получили для псевдонима C #. Если вы знаете это во время компиляции, вы можете использовать typeof() как обычно - псевдонимы C # на самом деле просто псевдонимы, поэтому typeof(int) == typeof(System.Int32). Существует нет разницы в испускаемом коде.

Если у вас есть строка, например "int", просто постройте карту:

Dictionary<string,Type> CSharpAliasToType = new Dictionary<string,Type>
{
    { "string", typeof(string) },
    { "int", typeof(int) },
    // etc
};

Получив Type, вы можете получить полное имя, сборку и т. Д.

Вот пример кода, который учитывает типы, допускающие значения Nullable:

public static Type FromCSharpAlias(string alias)
{
    bool nullable = alias.EndsWith("?");
    if (nullable)
    {
        alias = alias.Substring(0, alias.Length - 1);
    }
    Type type;
    if (!CSharpAliasToType.TryGetValue(alias, out type))
    {
         throw new ArgumentException("No such type");
    }
    return nullable ? typeof(Nullable<>).MakeGenericType(new Type[]{ type })
                    : type;
}
1 голос
/ 09 января 2011

Не будь таким сложным.

попробовать

typeof(bool).ToString()
typeof(string).ToString()
typeof(int).ToString()
typeof(char).ToString()

...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...