编译器说缺少动态 属性 但我可以看到它
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" 主程序集可见...我确实认为这会浪费工作。
我开始深入 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" 主程序集可见...我确实认为这会浪费工作。