我不确定这是否可行,而且我对在 C#.NET 中使用程序集还很陌生。
我想做的是在提供该类的字符串名称时创建该类的实例。像这样的事情:
using MyAssembly;
namespace MyNameSpace
{
Class MyClass
{
int MyValue1;
int MyValue2;
public MyClass(string myTypeName)
{
foreach(Type type in MyAssembly)
{
if((string)type == myTypeName)
{
//create a new instance of the type
}
}
AssignInitialValues(//the type created above)
}
//Here I use an abstract type which the type above inherits from
private void AssignInitialValues(AbstractType myClass)
{
this.value1 = myClass.value1;
this.value2 = myClass.value2;
}
}
}
显然,您无法将字符串与类型进行比较,但它说明了我正在尝试做的事情:创建在与提供的字符串不同的程序集中找到的类型。
有什么想法吗?
EDIT:
尝试后:
var myObject = (AbstractType) Activator.CreateInstance(null, myTypeName);
AssignInitialValues(myObject);
我收到一些错误:
- 可访问性不一致:参数类型“MyAssembly.AbstractType”比方法“MyNameSpace.MyClass.AssignInitialValues(MyAssembly.AstractType)”更难访问
- “MyAssembly.AstractType”由于其保护级别而无法访问
- 找不到类型或命名空间名称“MyAssembly”(您是否缺少 using 指令或程序集引用?)
- 找不到类型或命名空间名称“AbstractType”(是否缺少 using 指令或程序集引用?)
不完全确定为什么找不到程序集;我添加了对程序集的引用,并对程序集中的命名空间使用了“使用指令”。至于保护级别,它调用只能是公共的类(或者更确切地说是类的构造函数)。
有关问题出在哪里的任何线索吗?
UPDATE:
在浏览了几篇关于 SO 的文章后,我发现了这一点:https://stackoverflow.com/a/1632609/360627制作AbstractType
public 类解决了可访问性不一致的问题。
新的编译器错误是这样的:
无法将类型“System.Runtime.Remoting.ObjectHandle”转换为“MyAssembly.AbstractType”
它引用的行是这一行:
var myObject = (AbstractType) Activator.CreateInstance(null, myTypeName);
Using .Unwrap()
让我克服这个错误,我认为这是正确的方法(不确定)。但是,在运行程序时,调用此代码时我会收到 TypeLoadException。
TypeLoadException:无法从程序集“MyNameSpace”加载类型“AbstractType”...
我立即可以发现它正在寻找的类型是正确的,但它正在寻找的程序集是错误的。查找Activator.CreateInstance(String, String)
方法显示,第一个参数为 null 意味着该方法将在执行程序集中查找。这与原始帖子中所需的行为相反。
我尝试过使用MyAssembly
作为第一个参数,但这会产生错误:
“MyAssembly”是一个“命名空间”,但像“变量”一样使用
I think这是由于MyAssembly
不是一个字符串。但是如果我尝试'MyAssembly'
我收到以下编译器错误:
- 字符文字中的字符过多
- 'System.Activator.CreateInstance(System.ActivationContext, string[])' 的最佳重载方法匹配有一些无效参数
- 参数 1:无法从 'char' 转换为 'System.ActivationContext'
- 参数 2:无法从 'string' 转换为 'string[]'
在我看来,它试图使用错误的重载。
关于如何解决这个问题有什么想法吗?