我开始潜入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
:
但是,在尝试访问此属性时,编译器会喊出动态属性不存在。
答案 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;主要装配可见...我认为这将是浪费的工作。