使用“动态”类型定义动态加载的类属性

时间:2014-04-08 16:23:30

标签: c# dynamic reflection runtime

我正在加载在运行时生成的程序集,该程序集包含一个具有多个需要设置的属性的类。

根据我的研究,我发现这可以使用Reflection,所以这里是我加载程序集的方法:

        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'

无论如何我可以将类映射到动态变量中吗?

编辑:

动态ClassObj的字段显示“soma”的适当性

2 个答案:

答案 0 :(得分:0)

它对我来说很好,试试这个:

    public class TypeTest
    {
        public string mimimi { get; set; }
    }

   Type t = typeof(TypeTest);
   dynamic instanceTypeTeste = Activator.CreateInstance(t);
   instanceTipoTeste.mimimi = "test";

代码中可能存在的问题:

  • 要更改值,属性和类需要为Public
  • 正确的sintax,因为属性名称为区分大小写
  • 加载类型时,查看您的类的类型是否正确

答案 1 :(得分:0)

使用dynamic时,您必须确保您尝试访问的所有属性都已正确写入。或者您的财产不是soma,而是Soma,或者Type t = (Type)a.GetTypes()[0];不会返回您期望的类型。

我在这里尝试使用相同的代码,当我尝试访问具有不同名称的属性时,它会抛出相同的异常。

您也可以尝试编写程序集的所有路径:

Assembly a = Assembly.LoadFrom(@"C:\PathHere\ClassLibrary1.dll");

顺便说一下,您的班级和财产必须是公开的,否则您将无法正常访问。