将字符串转换为C#中的类型

Vin*_*ent 162 .net c# string types

如果我收到一个包含类名称的字符串,并且我想将此字符串转换为实际类型(字符串中的那个),我该怎么做?

我试过了

Type.GetType("System.Int32")
Run Code Online (Sandbox Code Playgroud)

例如,它似乎工作.

但是当我尝试使用自己的对象时,它总是返回null ...

我不知道提前在字符串中会有什么,所以它是我将其转换为真实类型的唯一来源.

Type.GetType("NameSpace.MyClasse");
Run Code Online (Sandbox Code Playgroud)

任何的想法?

Jon*_*eet 362

您只能使用刚刚类型的名称(连同其命名空间,当然),如果该类型是mscorlib或调用程序集.否则,您还必须包含程序集名称:

Type type = Type.GetType("Namespace.MyClass, MyAssembly");
Run Code Online (Sandbox Code Playgroud)

如果程序集名称很强,那么您必须包含所有这些信息.有关Type.GetType(string)更多信息,请参阅文档.

或者,如果您已经对组件进行了引用(例如,通过众所周知的类型),您可以使用Assembly.GetType:

Assembly asm = typeof(SomeKnownType).Assembly;
Type type = asm.GetType(namespaceQualifiedTypeName);
Run Code Online (Sandbox Code Playgroud)

  • Jon,正如你曾经说过的那样,当你没有收到upvotes是很可惜的,因为你是顶级用户.真正.当你没有收到upvotes时也很可惜,因为顶级用户也回答了这个问题.特别是当你没有收到upvotes时很可惜,因为Jon Skeet也回答了这个问题:) (6认同)
  • @abatishchev我怀疑他只是因为他是顶级用户而得到了很多票.你的答案稍微后一点(因为他们不会滚动超过第一个正确的答案,因此阅读它的人数会减少),他的帖子包含更多信息,他的帖子回答了原始问题(请参阅Jon对你原来帖子的评论).我想起了Jon的投票,但是因为他的帖子不容易阅读.我没有考虑投票给你,因为你基本上重述了操作,没​​有回答问题.简而言之,不要因为缺乏选票而责怪最高用户的存在. (6认同)
  • @Vinhent:只是试验一下,看起来你需要将方括号加倍以获得完全限定名:`Type.GetType("System.Collections.Generic.List`1 [[namespace.myClass,AssemblyName]]")`应该与`IList <T>`一起使用. (2认同)
  • @Vinhent:要调试所有这些情况,请选择一些内容并打印出其全名,例如`typeof(string []).FullName`.如果你自己学习如何做到这一点,那么比向我询问每个变化要容易得多. (2认同)

aba*_*hev 30

尝试:

Type type = Type.GetType(inputString); //target type
object o = Activator.CreateInstance(type); // an instance of target type
YourType your = (YourType)o;
Run Code Online (Sandbox Code Playgroud)

Jon Skeet通常是正确的:)

更新:您可以以各种方式指定包含目标类型的程序集,如Jon所述,或:

YourType your = (YourType)Activator.CreateInstance("AssemblyName", "NameSpace.MyClass");
Run Code Online (Sandbox Code Playgroud)

  • 关键是Type.GetType为OP返回null.请查看我的答案,了解最可能的原因. (6认同)

Chr*_*kes 15

如果您确实想要按名称获取类型,可以使用以下内容:

System.AppDomain.CurrentDomain.GetAssemblies().SelectMany(x => x.GetTypes()).First(x => x.Name == "theassembly");
Run Code Online (Sandbox Code Playgroud)

请注意,您可以提供有关您尝试加载的类型的更多信息,从而大大提高性能.