Сравните TypeOf "List <int>" с "System.Collections.Generic.List <int>" - PullRequest
0 голосов
/ 27 декабря 2018

Я создаю инструмент рефакторинга кода, в котором я получаю два типа переменных, используя токены / узлы из Roslyn API.

Мне нужно сравнить и проверить, совпадают ли эти два типа.Некоторые другие вопросы, такие как this , которые работают, если у вас есть объекты, однако мне нужно работать со строками и сравнивать типы в этом случае. Вот мой метод, который работает с typeName = "int", однако, когда typeName="List<int>", я получаюnull

 public static Type GetType(string typeName)
    {
        string clrType = null;

        if (CLRConstants.TryGetValue(typeName, out clrType))
        {
            return Type.GetType(clrType);
        }


        var type = Type.GetType(typeName);

        if (type != null) return type;
        foreach (var a in AppDomain.CurrentDomain.GetAssemblies())
        {
            type = a.GetType(typeName);
            if (type != null)
                return type;
        }
        return null;
    }
    private static Dictionary<string, string> CLRConstants { get{
            var dct =  new Dictionary<string, string>();
            dct.Add("int", "System.Int32");
            return dct;

        } }

1 Ответ

0 голосов
/ 27 декабря 2018

Вы можете получить и проверить все возможные типы сборки по приведенному ниже коду.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

namespace Rextester
{
    public class Program
    {
        public static void Main(string[] args)
        {
            foreach (var a in AppDomain.CurrentDomain.GetAssemblies())
            {
                foreach (var b in a.GetTypes())
                {
                    Console.WriteLine(b.FullName);
                }
            }
        }
    }
}

В распечатанном списке есть

System.Collections.Generic.List`1

, что для

List<T> 

типов.Если вы хотите, чтобы ваша точная потребность была

List<int>

Вы должны написать

System.Collections.Generic.List`1[System.Int32]

Таким образом, ваш код будет работать так:

public static Type GetType(string typeName)
{
    string clrType = null;

    if (CLRConstants.TryGetValue(typeName, out clrType))
    {
        return Type.GetType(clrType);
    }

    var type = Type.GetType(typeName);

    if (type != null) return type;
    foreach (var a in AppDomain.CurrentDomain.GetAssemblies())
    {
        type = a.GetType(typeName);
        if (type != null)
            return type;
    }
    return null;
}
private static Dictionary<string, string> CLRConstants { 
    get{
            var dct =  new Dictionary<string, string>();
            dct.Add("int", "System.Int32");
            dct.Add("List<int>", "System.Collections.Generic.List`1[System.Int32]");
            return dct;
    } 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...