C# 从 FullName 类型创建 class 的实例
C# Create an instance of a class from a type FullName
有人知道在给定类型的全名(namespace.classname 格式)但没有 AssemblyQualifiedName 的情况下创建 class 实例的简单方法吗?该类型的 FullName 仅包含在运行时引用和可用的单个程序集中,因此没有歧义。
我没有类型,我有一个字符串 - 只有全名,没有汇编部分。我不知道该程序集,我只知道它被引用并且只有一个程序集包含类型 fullname。
谢谢!
编辑:
这与从专有协议反序列化实例有关。我收到了很好的答案,但为了获得最佳解决方案而不是遍历所有程序集,我最终要做的是创建一个静态字典,其中包含 fullName 键和程序集限定名称作为值,因为我知道哪些是classes 并且它们是有限的集合。
您可以 get all of the active assemblies 然后逐一查找具有您的全名的类型。您需要为程序集之间存在多个匹配项或没有匹配项的可能性做好准备。
加载所有程序集并 select 加载它们的类型,然后过滤名称。
public static object CreateType(string typeName)
{
var allTypes = AppDomain.CurrentDomain
.GetAssemblies()
.SelectMany
(
a => a.GetTypes()
);
var type = allTypes.Single( t => t.Name == typeName );
return Activator.CreateInstance(type);
}
您可以考虑添加一些验证代码来检查重复项,并确保有默认构造函数。
有人知道在给定类型的全名(namespace.classname 格式)但没有 AssemblyQualifiedName 的情况下创建 class 实例的简单方法吗?该类型的 FullName 仅包含在运行时引用和可用的单个程序集中,因此没有歧义。
我没有类型,我有一个字符串 - 只有全名,没有汇编部分。我不知道该程序集,我只知道它被引用并且只有一个程序集包含类型 fullname。
谢谢!
编辑: 这与从专有协议反序列化实例有关。我收到了很好的答案,但为了获得最佳解决方案而不是遍历所有程序集,我最终要做的是创建一个静态字典,其中包含 fullName 键和程序集限定名称作为值,因为我知道哪些是classes 并且它们是有限的集合。
您可以 get all of the active assemblies 然后逐一查找具有您的全名的类型。您需要为程序集之间存在多个匹配项或没有匹配项的可能性做好准备。
加载所有程序集并 select 加载它们的类型,然后过滤名称。
public static object CreateType(string typeName)
{
var allTypes = AppDomain.CurrentDomain
.GetAssemblies()
.SelectMany
(
a => a.GetTypes()
);
var type = allTypes.Single( t => t.Name == typeName );
return Activator.CreateInstance(type);
}
您可以考虑添加一些验证代码来检查重复项,并确保有默认构造函数。