我正在加载在运行时生成的程序集,该程序集包含一个类,该类具有多个需要设置的属性。
根据我的研究,我发现使用反射可以做到这一点,因此以下是我加载程序集的方式:
Assembly a = Assembly.LoadFrom("ClassLibrary1.dll");
Type t = (Type)a.GetTypes()[0];
现在我尝试以这种方式定义属性:
object ClassObj = Activator.CreateInstance(t);
PropertyInfo p= t.GetProperties()[0];
int x=1;
p.SetValue(ClassObj,x);
这对我来说似乎不可行,所以我想使用"动态"类型。
dynamic ClassObj = Activator.CreateInstance(t);
ClassObj.soma = 1;
不幸的是,这似乎不起作用。
它指出:
'object' does not contain a definition for 'soma'
无论如何我可以将类映射到动态变量中吗?
编辑:
动态类 Obj 的字段显示"soma"属性
它对我来说很好用,试试这个:
public class TypeTest
{
public string mimimi { get; set; }
}
Type t = typeof(TypeTest);
dynamic instanceTypeTeste = Activator.CreateInstance(t);
instanceTipoTeste.mimimi = "test";
代码中可能出现的问题:
- 要更改值,需要
Public
属性和类 - 正确的 sintax,因为属性名称区分大小写
- 加载类型时,查看类的类型是否正确
当你使用 dynamic
时,你必须确保你尝试访问的所有属性都写正确。或者你的属性不是soma
,它可能Soma
,或者Type t = (Type)a.GetTypes()[0];
没有返回你期望的类型。
我在这里尝试使用相同的代码,当我尝试访问具有不同名称的属性时,它抛出了相同的异常。
您还可以尝试编写程序集的所有路径:
Assembly a = Assembly.LoadFrom(@"C:PathHereClassLibrary1.dll");
顺便说一下,你的类和属性必须是公共的,否则你将无法正确访问它。