比较TypeOf“ List <int>”与“ System.Collections.Generic.List <int>”

时间:2018-12-27 07:26:35

标签: c# reflection roslyn

我正在构建一个代码重构工具,其中使用Roslyn API的标记/节点获得两种变量类型。

我需要比较并验证两种类型是否相同。 其他一些问题,例如How to get URI from File?,这些问题在您有对象的情况下仍然有效,但是在这种情况下,我需要使用字符串并比较类型。这里我的方法与val bitmap = MediaStore.Images.Media.getBitmap(context!!.contentResolver, mSelectedUri) bitmap.compress(Bitmap.CompressFormat.PNG, 90, bytes) //compress to any quality 70-90 is preferred //new Image File val imageFile = File(docDir, imageFilename) //writing new compressed bitmap to file FileOutputStream(imageFile).use { fo -> imageFile.createNewFile() fo.write(bytes.toByteArray()) } 一起使用,但是当imageSizeInMB = imageFile.length().toDouble() / (1024 * 1024) 时我得到typeName = "int"

typeName="List<int>"

1 个答案:

答案 0 :(得分:0)

您可以通过以下代码获取并检查所有可能的程序集类型。

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;
    } 
}