typeof或Type.GetType表示非限定类型名称

时间:2009-12-16 15:12:47

标签: c#

我想做这样的事情:

Type t=typeof(int?);

Type t=typeof(MemoryStream);

但是参数是字符串(“int?”,“MemoryStream”等),并且它不在程序集限定类型名称中,因此Type.GetType(string)将不起作用。

我需要获取类型的原因是因为我正在做简单的代码生成器应用程序,它需要处理值和&引用类型不同的方式,如果type是Enumerable,它将迭代并执行特定的操作。

你对此有什么线索吗?

3 个答案:

答案 0 :(得分:1)

typeof能够解决这个问题的原因是编译器知道内置的C#语法快捷方式(intSystem.Int32X?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())

对于每种类型,您可以将其名称与您的名称进行比较。

如果你不太用它,这很好用,因为性能不是很好。你可以通过创建一个词典来改进它。