C#按源名称查找类型并获取类型的源名称

C#按源名称查找类型并获取类型的源名称,c#,.net,C#,.net,我需要按名称获取一个C#type,其中接口应该与typeof几乎相同,只是字符串在运行时命名,而不是在编译时命名的类型,即typeof(x)==runtime_typeof(“x”)对于所有x。相当关键的是,我还需要处理各种泛型情况,如泛型定义和泛型类型 我在C#中见过其他一些按名称获取类型的解决方案,但它们似乎都涉及CLR损坏的名称,而不是C#源名称 此外,我需要检索给定类型对象的源名称,该对象应具有相同的形式 如何通过C#源名称查找类型并从类型中检索C#源名称 编辑:程序集限定名和C#源名称

我需要按名称获取一个C#type,其中接口应该与
typeof
几乎相同,只是字符串在运行时命名,而不是在编译时命名的类型,即
typeof(x)==runtime_typeof(“x”)
对于所有
x
。相当关键的是,我还需要处理各种泛型情况,如泛型定义和泛型类型

我在C#中见过其他一些按名称获取类型的解决方案,但它们似乎都涉及CLR损坏的名称,而不是C#源名称

此外,我需要检索给定
类型
对象的源名称,该对象应具有相同的形式

如何通过C#源名称查找类型并从类型中检索C#源名称


编辑:程序集限定名和C#源名称不是一回事。因此,问题的明确性

我真正想要的是,这些名称应该与您在C源代码中引用它们时使用的名称相同,因此
IEnumerable
IEnumerable
,而不是
IEnumerable
[1]`或其他任何名称。需要完整的名称空间对我来说很好,而且我已经知道要查看哪些程序集,所以这主要是一个涉及泛型和名称损坏时会发生什么的问题。

  • 通过字符串源代码表示检索类型名称
经过深思熟虑,我想我终于找到了解决你核心问题的方法。如果您真正需要的只是一个可以接受字符串参数的typeof()函数,那么您可以使用CSharpCompilerServices来实现:

 // set the assembly location, namespace, and string name of desired type
 var assemblyLocation = Assembly.GetExecutingAssembly().Location;
 var namespaceToType = "Namespace.Of.Type";
 var desiredType = "C<int>";

 // write some code using above parameters
 var template = "using {0};\nusing System;\npublic class Snippet {{\n\tpublic static Type main() {{\n\t\treturn typeof({1});\n\t}}\n}}";

 var code = string.Format(template, namespaceToType, desiredType);

 // compile code in memory, then return value via reflection
 var provider = CodeDomProvider.CreateProvider("CSharp");
 var parameters = new CompilerParameters();
 parameters.GenerateExecutable = false;
 parameters.GenerateInMemory = true;
 parameters.ReferencedAssemblies.Add(assemblyLocation);
 var results = provider.CompileAssemblyFromSource(parameters, code);
 return mytype = results.CompiledAssembly.GetType("Snippet").GetMethod("main").Invoke(null, null) as Type;
根据本文:

如果类型位于当前执行的程序集中或Mscorlib.dll中,则提供由其命名空间限定的类型名就足够了

  • 按名称空间限定名检索类型(部分匹配)


Assembly.GetType
Type.GetType
?顺便说一句,它看起来像XY问题。你想达到什么目的,也许有更好的解决方案?我不确定我是否理解你的要求。对不起。但是对于泛型类型,您需要使用back tick、泛型参数count和[type name]。例如
Type t=Type.GetType(“System.Collections.Generic.List
1[System.Int32]”;Type t2=Type.GetType(“System.Collections.Generic.Dictionary
2[System.Int32,System.String]”Type.GetType
需要“程序集限定名”才能正常工作。在键入注释时正在进行编辑:)。程序集限定名和C#源名称不是一回事。我知道,但只要在当前执行的程序集中定义了类型,名称空间限定名就足够了。如果上述方法不够,我会发布一个替代方案。
return Type.GetType("System.Int32");
Assembly.GetExecutingAssembly()
        .DefinedTypes.Where(type => type.Name.Contains("MyType")).First();