Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过提供类名作为字符串来获取引用程序集中的类型?_C#_.net_Reflection_.net Assembly_Gettype - Fatal编程技术网

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

C# 通过提供类名作为字符串来获取引用程序集中的类型?,c#,.net,reflection,.net-assembly,gettype,C#,.net,Reflection,.net Assembly,Gettype,这些都是类似的问题:,但两个答案都不起作用 我有一个MVC项目,它从数据库中提取数据,该数据库将普通类型作为字符串包含。这些类型位于引用的程序集中,而不是MVC项目中 例如,假设我引用的装配名称为MyFramework,普通类型名称为Car,完整类型名称可以是MyFramework.Cars.Car或MyFramework.Vehicles.Cars.Car或其他变体。我所拥有的只是作为字符串引用的程序集名称和普通类名。无论类型的全名如何,如何获取类型 最后,我可以在引用的程序集中编写一个调用G

这些都是类似的问题:,但两个答案都不起作用

我有一个MVC项目,它从数据库中提取数据,该数据库将普通类型作为字符串包含。这些类型位于引用的程序集中,而不是MVC项目中

例如,假设我引用的装配名称为
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项目中,我可以调用它,而不需要程序集作为字符串名。这是可能的还是我总是需要程序集名称?

可能引用的程序集当时没有加载。另外,我从您的问题中了解到,您没有完整的类型名称,只有类名
那么,你应该沿着这条路线试试:

Type type = Assembly.Load("YourAssemblyName").GetTypes().First(t => t.Name == "ShortTypeName");

希望我理解正确。

对于第一个问题,您可以这样做

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

我不知道你说的第二个问题是什么意思。

为什么其他答案不起作用?@RobertHarvey,因为我只有一个简单的类名。不是完整的类型名。这些答案依赖于知道完整的类型。如果我在该程序集中编写一个Util,但仍然只有类名,它会是什么样子?我想通过编写一个
TypeUtil
类来消除对程序集名称的需要,该类可以具有
GetTypeFromFramework(stringtypename)
函数。我想如果我在该程序集中调用
GetType
,我根本不需要使用该程序集,但它仍然返回null。请发布一个您尝试执行的示例,以便我们更好地了解您的情况。我编辑了问题。您的答案在my Util中使用时有效。我只是好奇是否可以将对程序集名称的依赖作为字符串删除。我的印象是,如果我在该程序集中调用GetType(),我就不需要提供程序集名称,而只需提供
Type。GetType(类名)
一直返回null,即使该代码在引用的程序集中。好吧,此方法只有在提供命名空间时才有效。您不必拥有程序集。。但至少您需要完整的类型名称。