我正在使用 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/