编译器说缺少动态 属性 但我可以看到它

Compiler says dynamic property is missing but I can see it

我开始深入 C# Dynamics and Metaprogramming 的世界,遇到了一些麻烦。

我设法创建了一个 CodeDom 树,并生成了以下代码:

namespace Mimsy {
    using System;
    using System.Text;
    using System.Collections;

    internal class JubJub {
         private int _wabeCount;
         private ArrayList _updates;

         public JubJub(int wabeCount) {
               this._updates = new ArrayList();
               this.WabeCount = wabeCount;
         }

         public int WabeCount {
               get {
                   return this._wabeCount;
               }
               set {
                   if((value < 0))
                        this._wabeCount = 0;
                   else
                        this._wabeCount = value;
                   this._updates.Add(this._wabeCount);
               }
         }

         public string GetWabeCountHistory() {
               StringBuilder result = new StringBuilder();
               int ndx;
               for(ndx = 0; (ndx < this._updates.Count); ndx = ndx + 1) {
                     if((ndx == 0))
                            result.AppendFormat("{0}", this._updates[ndx]);
                     else
                            result.AppendFormat(", {0}", this._updates[ndx]);
               }
         }
    }
}

然后我将此命名空间动态编译为名为 "dummy".

的程序集

我可以成功获取此类型的实例:

string typeName = "Mimsy.JubJub";
Type type = dummyAssembly.GetType(typeName);
dynamic obj = Activator.CreateInstance(type, new object[] { 8 });
//obj is a valid instance type

如果我调试这段代码,我可以在调试器中看到 obj 实际上有 属性 WabeCount:

但是,当试图访问此 属性 时,编译器会提示动态 属性 不存在。

您的代码存在一个或两个问题:

  • 您正在使用 internal class,并试图通过 dynamic 访问它。这两件事不能很好地结合在一起。参见 。使用 public clasas

  • 你需要在赋值给wabeCount之前进行转换,比如:

    obj.WabeCount = (int)wabes[ndx]
    

请注意,从技术上讲,如果您的 "main" 程序集是强命名的,您可以将 InternalsVisibleToAttribute 添加到 "dynamic" 程序集以使其 internal "things" 主程序集可见...我确实认为这会浪费工作。