通过提供类名字符串获取引用程序集中的类型?

12

这些是类似的问题:如何在Silverlight中使用字符串加载引用程序集中的类型在引用的程序集中对一个类使用GetType()失败,但是这两个回答都不起作用。

我有一个MVC项目,从数据库中获取包含以字符串形式表示的简单类型的数据。这些类型在引用程序集中,而不在MVC项目中。

例如,假设我的引用程序集名称为MyFramework,普通类型名为Car,完整的类型名称可能是MyFramework.Cars.CarMyFramework.Vehicles.Cars.Car或其他一些变体。我只有引用程序集名称和普通类名称的字符串。无论完整类型名称如何,我该如何获得类型?

最后,我可以在引用程序集中编写一个调用GetType()的函数,并在MVC项目中使用它,以便省略包含程序集名称吗?我想要去除知道程序集名称的要求,所以我想在引用程序集中编写一个实用程序,例如:

namespace MyFramework //the referenced assembly
{
  public static class TypeUtil
  {
    public static Type GetFrameworkType(string typeName)
    {
        return Type.GetType(typeName);
    }
  }
}

然后在我的MVC项目中,我可以调用它而不需要将程序集作为字符串名称传递。这是否可能或者我总是需要程序集名称?


为什么其他答案不起作用? - Robert Harvey
@RobertHarvey 这是因为我只有普通的类名,而不是完整的类型名称。那些答案依赖于知道完整的类型。 - SventoryMang
2个回答

32
也许在那个时候该程序集并没有被加载。同时,我从你的问题中了解到你只有类名而没有完整的类型名称。
那么你可以尝试以下方法:
Type type = Assembly.Load("YourAssemblyName").GetTypes().First(t => t.Name == "ShortTypeName");

希望我理解您的意思是正确的。

如果我在那个程序集中编写了一个Util,但仍然只有类名,它会是什么样子?我想通过编写一个TypeUtil类来消除对程序集名称的需求,该类可以具有GetTypeFromFramework(string typeName)函数。我认为如果我在该程序集中调用GetType,则根本不需要使用程序集,但它仍然返回null。 - SventoryMang
请提供您尝试做的示例,这样我们可以更好地了解您的情况。 - Jony Adamit
我编辑了这个问题。你的答案在我的Util中使用时有效。我只是好奇是否可以去掉程序集名称作为字符串的依赖性。我认为如果我在该程序集中调用GetType(),就不需要提供程序集名称,但是即使在引用的程序集中,仅提供Type.GetType(class name)仍然返回null。 - SventoryMang
嗯,只有在提供命名空间的情况下,这种方法才能起作用。 - Jony Adamit
你不必拥有程序集,但至少需要完整的类型名称。 - Jony Adamit
好的,那我猜我还是会继续了解汇编语言。因为完整的类型名称肯定不会被提供。 - SventoryMang

11

对于第一个问题,您可以尝试以下方法:

Type t = AppDomain.CurrentDomain.GetAssemblies()
                                .Where(a => a.FullName == "MyFramework")
                                .SelectMany(a => a.GetTypes())
                                .FirstOrDefault(t => t.Name == "Car");

我不确定你在第二个问题中的意思。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接