从字符串值获取对象类型

时间:2014-09-17 13:59:34

标签: c#

我正在编写一个客户类,它将读取CS文件并根据方法名称及其各种参数吐出信息。

这实质上是读取每一行寻找密钥(公共,类等),然后看看它的全部内容。无论如何这个位工作正常,我遇到的问题是处理各种不同的类型。

所以我需要做的是弄清楚这个类型是在.Net中本地发现的,还是我创建的东西,只要我有一些方法可言,我真的不会被打扰。

我已经尝试Type t = Type.GetType("My.Namespace.Classname");但是这只是返回null,即使我的自定义类对象的完整命名空间和名称也是如此。但是,如果我要使用System.String执行相同的代码,它可以正常工作,但我无法真正考虑整个框架中的每个可能的命名空间。这意味着我需要一种方法来获取没有完整命名空间的类型,或者知道如何使用GetType检查我自己的自定义对象。

有人可以就如何解决此问题提供任何建议吗?即使它正在创建一个足够的对象的新实例,但我再也没有.Net对象的完整命名空间。

编辑:一点背景 我正在做的是读取我在StreamReader中创建的类,原因是我创建了很多它们并且需要在一个系统能够理解的对象之间进行制作,而另一个,所以这个代码会阅读所有内容,然后为我创建映射。在大多数情况下,这是非常好的,只有当我有自定义类型时,我才想确定这些是标记它们。

3 个答案:

答案 0 :(得分:1)

  

我尝试过Type t = Type.GetType(“My.Namespace.Classname”);但是这个   只返回null

您需要提供完整的程序集限定名称:

Type t = Type.GetType("My.Namespace.Classname, MyAssembly");

From MSDN

  

参数

     

的typeName   键入:System.String

     

要获取的类型的程序集限定名称。请参阅AssemblyQualifiedName。如果类型在当前正在执行   汇编或在Mscorlib.dll中,提供类型名称就足够了   由其命名空间限定。

无论如何,如果你想解析C#代码进行分析,我会看一下NRefactory - an open source C# parser -

Here's an introduction in CodeProject to NRefactory

答案 1 :(得分:1)

  

我已经尝试了Type t = Type.GetType("My.Namespace.Classname");,但即使使用我的自定义类对象的完整命名空间和名称,它也会返回null。

我怀疑这是因为它不在调用程序集或mscorlib中,这是由Type.GetType检查的唯一两个不受程序集限定的名称的程序集。 / p>

如果你知道所涉及的所有程序集,你可以在每个程序集上调用Assembly.GetType(namespaceQualifiedName)

但是,如果您甚至没有名称空间限定名称,则应该在所有相关程序集中创建所有类型的查找在他们的名字上。例如:

var lookup = assemblies.SelectMany(a => a.GetTypes())
                       .ToLookup(t => t.Name);

此时,对于您拥有的每个名称(例如示例中的Classname),您可以找到具有该名称的所有类型:

foreach (var type in lookup[name])
{
    // Do something with type
}

答案 2 :(得分:0)

Type.GetType(some_type_name)将返回类型对象,如果此some_type_name是声明任何程序集已加载的类型名称,或者Mscorlib.dll

因此,如果您正在从.cs文件解析类型而不是加载 - 它将始终为null,并且源文件中的类型名称为