C# 如何从类型';s名称和程序集';姓名
我需要获取一个类型的实例,该类型的名称和程序集名称将在运行时保留。我预先知道该类型将有一个无参数构造函数。最简单的方法是什么 这比我希望的要难C# 如何从类型';s名称和程序集';姓名,c#,reflection,C#,Reflection,我需要获取一个类型的实例,该类型的名称和程序集名称将在运行时保留。我预先知道该类型将有一个无参数构造函数。最简单的方法是什么 这比我希望的要难 编辑:我不确定这是否相关,但程序集将被引用。我不需要从磁盘或其他地方加载它。以下内容就足够了: var assmebly = Assembly.Load("FullyQualifiedAssemblyName"); var type = assmebly.GetType("FullTypeName"); var instance = Activator.
编辑:我不确定这是否相关,但程序集将被引用。我不需要从磁盘或其他地方加载它。以下内容就足够了:
var assmebly = Assembly.Load("FullyQualifiedAssemblyName");
var type = assmebly.GetType("FullTypeName");
var instance = Activator.CreateInstance(type);
发件人:
Activator.CreateInstance方法(字符串,字符串)
使用命名程序集和默认构造函数创建指定名称的类型的实例
public static ObjectHandle CreateInstance(
string assemblyName,
string typeName
)
例如:
Type referencedType=typeof(参考类型);
AreReferencedType实例=Activator.CreateInstance();
或
Type Type=Type.GetType(“类型的全名”);
对象实例=Activator.CreateInstance(类型);
如果引用System.Web.dll对您来说不是问题,那么有一种鲜为人知的方法非常有效。它甚至不需要程序集名称,因为它在当前AppDomain执行路径中扫描程序集中的类型
因此,代码应该是:
object instance = Activator.CreateInstance(BuildManager.GetType("MyNamespace.MyClass", true));
下面是一些使用奇特的
dynamic
关键字的功能。您需要引用其他类以通过测试,或者使用生成事件在生成的DLL上进行复制
namespace TestLibrary
{
[TestFixture]
public class Tests
{
[Test]
public void FileCheck()
{
dynamic otherClass =
AppDomain.CurrentDomain.CreateInstanceFromAndUnwrap("OtherLibrary.dll",
"Prefix.OtherLibrary.SomeClass");
otherClass.SayHello(); // look, ma! no casting or interfaces!
}
}
}
namespace Prefix.OtherLibrary
{
public class SomeClass
{
public void SayHello()
{
Console.WriteLine("Hello, world.");
}
}
}
与
Activator
不同,AppDomain.CurrentDomain.CreateInstanceFromAndUnwrap
将文件名作为第一个参数,而不是类型说明符。这有时很有用,尤其是当您不关心程序集的强名称时。@David:问题出在哪里?我添加了一个工作示例;这有帮助吗?可能是因为我没有为程序集指定版本、区域性和PublicKeyToken,所以它不起作用。但这些例子似乎并不能做到这一点,事实上鲜为人知。谢谢你的提示。非常有用和方便。如果core>采用有趣的方法,则会更有用。我认识你吗?我在运行时只有程序集和类的名称。在第二个代码段中,GetType不也需要程序集的名称吗?我想是的。@David,如果你使用完全限定类型名,那就不需要程序集的名称了。总之,这一切都很好。@David,是的,这是.net用字符串唯一标识类型的方法。请注意,第二种方法是不安全的,即重构(如果更改类型的名称,则在构建时不会出错)。关于缺乏安全性,您是完全正确的,但我看不到解决方法。调用类型的引用必须以某种方式存储在数据库中…这是我使用的方法,我正在标记这个方法。谢谢
Type referencedType = typeof(AReferencedType);
AReferencedType instance = Activator.CreateInstance<AReferencedType>();
or
Type type = Type.GetType("Type's full name");
object instance = Activator.CreateInstance(type);
object instance = Activator.CreateInstance(BuildManager.GetType("MyNamespace.MyClass", true));
Activator.CreateInstance(Type.GetType("System.Int32"));
namespace TestLibrary
{
[TestFixture]
public class Tests
{
[Test]
public void FileCheck()
{
dynamic otherClass =
AppDomain.CurrentDomain.CreateInstanceFromAndUnwrap("OtherLibrary.dll",
"Prefix.OtherLibrary.SomeClass");
otherClass.SayHello(); // look, ma! no casting or interfaces!
}
}
}
namespace Prefix.OtherLibrary
{
public class SomeClass
{
public void SayHello()
{
Console.WriteLine("Hello, world.");
}
}
}