编译器说动态属性丢失但我可以看到它

时间:2015-05-20 11:55:21

标签: c# .net dynamic reflection metaprogramming

我开始潜入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

Debugger Information

但是,在尝试访问此属性时,编译器会喊出动态属性不存在。

Debugger Information 2

1 个答案:

答案 0 :(得分:1)

您的代码有一个或两个问题:

  • 您使用的是internal class,并尝试使用dynamic访问它。这两件事并不能很好地发挥作用。见https://stackoverflow.com/a/18806787/613130。使用public clasas

  • 您需要在将值分配给wabeCount之前转换该值,例如:

    obj.WabeCount = (int)wabes[ndx]
    

请注意,从技术上讲,如果你的&#34;主要&#34;程序集名称很强,您可以将InternalsVisibleToAttribute添加到&#34;动态&#34;汇编以制作internal&#34;事物&#34;主要装配可见...我认为这将是浪费的工作。