这些是类似的问题:How-to: Load a type from a referenced assembly at runtime using a string in Silverlight,GetType on a class in a referenced assembly fails,但两种答案都不起作用。
我有一个MVC项目,它从包含普通类型作为字符串的数据库中提取数据。这些类型位于引用的程序集中,而不是MVC项目中。
例如,假设我的Referenced程序集名称为MyFramework
,普通类型名称为Car
,完整的类型名称可以是MyFramework.Cars.Car
或MyFramework.Vehicles.Cars.Car
或其他一些变体。我只有引用的程序集名称和普通的类名称作为字符串。无论完整的类型名称如何,我如何获得类型?
最后,我可以在引用的程序集中编写一个函数来调用GetType()并在MvC项目中使用它,这样我可以放弃包括程序集名称吗?我想删除已知的程序集名称,所以我想我可以在引用的程序集中编写一个Util,如:
namespace MyFramework //the referenced assembly
{
public static class TypeUtil
{
public static Type GetFrameworkType(string typeName)
{
return Type.GetType(typeName);
}
}
}
然后在我的MVC项目中,我可以调用它而不需要将程序集作为字符串名称。这可能还是我总是需要汇编名称?
答案 0 :(得分:22)
当时可能没有加载引用的程序集。另外,我从你的问题中了解到你没有完整的类型名称,只有类名。
你应该沿着这条线尝试一下:
Type type = Assembly.Load("YourAssemblyName").GetTypes().First(t => t.Name == "ShortTypeName");
希望我理解正确。
答案 1 :(得分:10)
对于第一个问题,您可以执行类似
的操作Type t = AppDomain.CurrentDomain.GetAssemblies()
.Where(a => a.FullName == "MyFramework")
.SelectMany(a => a.GetTypes())
.Where(t => t.Name == "Car")
.FirstOrDefault();
我不确定你的第二个问题是什么意思。