【问题标题】:Defining dynamically loaded class attributes with "dynamic" type使用“动态”类型定义动态加载的类属性
【发布时间】:2014-05-21 11:45:29
【问题描述】:

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

根据我的研究,我发现使用反射可以做到这一点,因此这是我加载程序集的方式:

        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”属性

【问题讨论】:

  • ClassObjSoma 属性是否公开?
  • 是的。这是一个简单的测试类: public int soma { get;放; }
  • dynamic 区分大小写,您确定您的属性名称不是Soma 吗?
  • 属性“Soma”是公开的。课堂没有。我现在可以按照我想要的方式映射类。

标签: c# dynamic reflection runtime


【解决方案1】:

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

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

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

您的代码中可能存在的问题:

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

【讨论】:

  • 类是从 .dll 文件中加载的。
  • @user3466681 但是属性“soma”是公开的吗?
  • @user3466681 没关系。属性“Soma”需要为Public,如果不是,您只需将值更改为PropertyInfo
  • @user3466681 你确定Assembly没有加载不正确的Type在线(Type)a.GetTypes()[0]吗?
  • 属性“Soma”是公开的。课堂没有。这解决了问题。谢谢你!
【解决方案2】:

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

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

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

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

顺便说一句,你的类和属性必须是公开的,否则你将无法正常访问它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 2019-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多