我想做这样的事情:
Type t=typeof(int?);
或
Type t=typeof(MemoryStream);
但是参数是字符串(“int?”,“MemoryStream”等),并且它不在程序集限定类型名称中,因此Type.GetType(string)将不起作用。
我需要获取类型的原因是因为我正在做简单的代码生成器应用程序,它需要处理值和&引用类型不同的方式,如果type是Enumerable,它将迭代并执行特定的操作。
你对此有什么线索吗?
答案 0 :(得分:1)
typeof
能够解决这个问题的原因是编译器知道内置的C#语法快捷方式(int
为System.Int32
,X?
为Nullable<X>
1}}等)和查看using指令,和它知道要查看哪些程序集。
如果您希望能够处理C#编译器可以处理的任何事情,您自己就需要这些信息。 (我假设您不需要名称空间别名等,但是......)
您能提供一个程序集列表和一个要检查的命名空间列表吗?
答案 1 :(得分:1)
好吧,你可以创建一个即时编译器,如下所示:
string getTypeHack = @"using System; public static class TypeHacker {{ public static Type GetThisType() {{ return typeof({0}); }} }}";
CodeDomProvider codeProvider = CodeDomProvider.CreateProvider("CSharp");
CompilerParameters parameters = new CompilerParameters();
parameters.GenerateInMemory = true;
parameters.GenerateExecutable = false;
CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, string.Format(getTypeHack, "int"));
Type hacker = results.CompiledAssembly.GetType("TypeHacker");
MethodInfo hack = hacker.GetMethod("GetThisType");
Type actualType = (Type)hack.Invoke(null, null);
......但这可能是一个非常糟糕的主意。对于要测试的每种类型,都需要一个新的内存中程序集。一些问题摆脱了我的头脑:
(我可能实际上是在暗示自己建议......):^)
有没有办法重构应用程序以传递类型?它会让你的生活变得更加轻松。
答案 2 :(得分:0)
您可以使用所有类型枚举 AppDomain.CurrentDomain.GetAssemblies()。SelectMany(a =&gt; a.GetExportedTypes())
对于每种类型,您可以将其名称与您的名称进行比较。
如果你不太用它,这很好用,因为性能不是很好。你可以通过创建一个词典来改进它。