【问题标题】:How to access runtime compiled type's field如何访问运行时编译类型的字段
【发布时间】:2013-11-25 12:59:32
【问题描述】:

我使用 CSharpCodeProvider 从字符串编译一个类,并将编译后的类的实例作为动态返回:

CodeDomProvider compiler = CSharpCodeProvider.CreateProvider("CSharp");
CompilerResults compilerResults = compiler.CompileAssemblyFromSource(parms, myClassCode);
Assembly assembly = compilerResults.CompiledAssembly;
resultType = assembly.GetType("MyClass");
var res = resultType.GetConstructor(new Type[] {}).Invoke(new object[] {});
return (dynamic)res;

所有编译都没有错误并返回实例是我需要的,但是当我尝试访问它的某些字段时,我得到一个异常:

'object' 不包含 MyInstancePublicField 的定义

我认为我的错误是使用强制转换为动态类型,但我没有发现任何其他方法可以访问仅在运行时才知道的字段。

【问题讨论】:

  • 设为public,或使用反射。
  • MyInstancePublicField 是公共字段
  • 也将类型公开。
  • 它帮助了我,谢谢!你可以把它写成答案,被接受。

标签: c# dynamic codedom


【解决方案1】:

默认情况下,dynamic 不允许您使用不可访问的成员。

由于您的类型是在不同的程序集中定义的,因此您需要将类型和属性设置为public

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    相关资源
    最近更新 更多