c# - 尝试设置 native 属性时动态关键字抛出 RunTimebinderException

标签 c# .net c#-4.0 dynamic .net-4.0

我正在使用 dynamic 关键字来处理外部程序集,就访问它的方法和原始类型成员而言,它工作正常。因此,例如我的类动态加载的类如下所示:

public class Student
{
    public bool IsGood { get; set; }
    public StudentType St { get; set; }
    public University University { get; set; }
}

我可以通过执行以下操作从程序集中动态加载对象:

var assembly = Assembly.LoadFrom("//path");

Type type = assembly.GetType("TestFrameWork.Student");
var student = Activator.CreateInstance(type); 

它在以下代码上失败:

student.IsGood = true;
student.St = TestFrameWork.StudentType.SomethingElse;

Student Type 是来自动态加载程序集的枚举;

我可以获得学生对象。现在是有趣的部分。我可以调用它的方法。我可以获得它的所有属性。我可以设置它的原始属性

所以我几乎可以做 student.IsGood = true;它将设置该属性。如果我有其他类型为 int、float 等的原始属性,情况同样如此。

但是

当我尝试将其设置为动态加载程序集的原生属性时,失败并出现 RuntimeBinderException

例如,

如果我尝试执行 student.University = new University(),其中 University 是一种本地类型的加载程序集。它失败。

这是堆栈跟踪:

at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
at System.Activator.CreateInstance(Type type, Boolean nonPublic) at System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes, StackCrawlMark& stackMark) at System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes) at System.Reflection.Assembly.CreateInstance(String typeName, Boolean ignoreCase, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes) at System.Reflection.Assembly.CreateInstance(String typeName) at TaskManagementFramework.PluginModule.CreateInstanceT in c:\Dropbox\CPTFramework_DynamicLoading\TaskManagementFramework\Plugin Loading\PluginModule.cs:line 19 at TaskManagementFramework.PluginLifecycleManager.GetPluginInstance(String id, String parentXmlSectionDescription, Type expectedInterface, Boolean useSingleInstance, IPlugin& plugin) in c:\Dropbox\CPTFramework_DynamicLoading\TaskManagementFramework\Plugin Loading\PluginLifecycleManager.cs:line 53 at TaskManagementFramework.PluginsXmlParser.ParsePlugins(XElement pluginsListElement, String parentXmlSectionDescription, PluginLifecycleManager pluginLifecycleManager, List`1& plugins) in c:\Dropbox\CPTFramework_DynamicLoading\TaskManagementFramework\XML Parsing\PluginsXmlParser.cs:line 39

知道为什么吗?我通过互联网搜索没有任何内容专门解决这个问题..

最佳答案

总结一下:.NET Framework 4.0 绝对不支持直接分配动态加载程序集的原生类型。

这意味着我们将不得不做上面的答案中建议的事情,即:

Type type = assembly.GetType("TestFrameWork.Student");
 type.GetProperty("University").SetValue(student, new University(), null);

如果您在运行时加载整个程序集(您可能就是这样),您也不会有 University type ar 编译时间。在这种情况下,您的解决方案是

type2 =  assembly.GetType("TestFrameWork.University");
type.GetProperty("University").SetValue(student, Activator.CreateInstance(type2`enter code here`), null);

希望这对您有所帮助。

但我认为这是 .Net 4.0 中的错误。不过我可能是错的

关于c# - 尝试设置 native 属性时动态关键字抛出 RunTimebinderException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18405348/

相关文章:

c# - 重新编译引用的程序集时常量值不变

c# - 如何知道使用 Sitefinity OwinContext 登录失败的原因?

c# - 这个代码是什么意思?

.net - 我可以调试已编译的程序集吗?

.net - Dllimport 可在控制台应用程序中运行,但不能在 ASP.NET 网站中运行

c# - 除去除数字外的所有内容的正则表达式是什么?

asp.net-mvc - 在 MVC 布局菜单上显示和更新购物车计数

c# - 导出列表<float>到excel文件

c# - 有没有办法在 .NET Core 中使用 Entity Framework?

.net - 我们应该如何为 NHibernate 实体实现 Equals 和 GetHashCode