相关疑难解决方法(0)

C#的解析器

哪些解析器可用于解析C#代码?

我正在寻找一个可以在C#中使用的C#解析器,让我可以访问有关所分析代码的每个人工制品的行和文件信息.

c# parsing

99
推荐指数
5
解决办法
6万
查看次数

如何从 C# 类型名称字符串中获取类型?

我一直在研究Type.NamespaceType.NameType.FullName和的返回值Type.AssemblyQualifiedName。存在不一致之处。

对于像 这样的内部类ConsoleApplication8.Program+InnerClass,命名空间返回ConsoleApplication8Name返回InnerClass,省略Program,因此连接Type.NameSpaceType.Name将是类名的不完整表示(仅作为示例)。

就连FullName属性也不一致。尽管它省略了程序集名称并返回ConsoleApplication8.Program+InnerClass这样的内部类,但FullName在诸如此类的类型的泛型参数中包含程序集名称List<long>(即使外部泛型类型本身省略了程序集名称,所以我猜那里存在一定程度的一致性)。

我目前正在将此代码与缓存类型名称查找一起使用,该查找使用 CodeDom 生成真正的 C# 代码名称。基本上,我试图扭转这个过程来获取类型,给定一个真实的类名。

static System.Collections.Concurrent.ConcurrentDictionary<Type, string> typeNameCache = new System.Collections.Concurrent.ConcurrentDictionary<Type, string>();

static string GetTypeName(Type type)
{
    string name;
    if (!typeNameCache.TryGetValue( type, out name ))
    {
        var codeDomProvider = CodeDomProvider.CreateProvider("C#");
        var typeReferenceExpression = new CodeTypeReferenceExpression(new CodeTypeReference(type));
        using (var writer = new StringWriter())
        {
            codeDomProvider.GenerateCodeFromExpression(typeReferenceExpression, writer, …
Run Code Online (Sandbox Code Playgroud)

.net c# reflection formatting typename

2
推荐指数
1
解决办法
1万
查看次数

为什么 Assembly.GetType() 不适用于泛型类型实例?

我在单独的程序集中有一个通用类:

class MyGenericClass<T> { }
Run Code Online (Sandbox Code Playgroud)

在另一个程序集中,我尝试这样做:

var assembly = System.Reflection.Assembly.LoadFrom(@"C:\path-to\MyClassLibrary.dll");  
var t1 = assembly.GetType("MyClassLibrary.MyGenericClass`1");
var t2 = assembly.GetType("MyClassLibrary.MyGenericClass`1[System.String]");
Run Code Online (Sandbox Code Playgroud)

现在,第一次调用GetType将返回泛型类型,但第二次调用将返回 null。

我测试了对以下类型执行相同的操作List<>

var assembly2 = System.Reflection.Assembly.LoadFrom(@"C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.dll");
var t3 = assembly2.GetType("System.Collections.Generic.List`1[System.String]");
Run Code Online (Sandbox Code Playgroud)

现在,这一次有效了。返回的类型List<String>。这让我完全困惑。

为什么GetType()在使用类型参数调用时无法获取我的类型,而在使用相同类型参数调用时[System.String]能够获取类型?List

还有其他方法可以获取我的类型吗?我知道我可以解析类型名,提取部分MyClassLibrary.MyGenericClass'1[System.String],然后根据这些类型实例化通用类型,但我可能会在此过程中搞砸一些事情,所以我正在寻找一种更简单,可靠的内置方法来获取这个类型的对象。

c# generics reflection

2
推荐指数
1
解决办法
984
查看次数

标签 统计

c# ×3

reflection ×2

.net ×1

formatting ×1

generics ×1

parsing ×1

typename ×1