Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#中的反射会失败吗?_C#_Reflection - Fatal编程技术网

C#中的反射会失败吗?

C#中的反射会失败吗?,c#,reflection,C#,Reflection,我们有一个用C#开发的应用程序。我们将所有资源存储在一个中央资源DLL中,该资源包含图像、图标和字符串,我们从中支持多种区域性 我们使用以下代码访问解决方案中任何项目的资源 private ResourceManager ResMan; ResMan = new ResourceManager("libResx.Resource", Assembly.ReflectionOnlyLoad("libResx")); 然后我们使用访问资源的任何元素 btnClose.Text = ResMan.G

我们有一个用C#开发的应用程序。我们将所有资源存储在一个中央资源DLL中,该资源包含图像、图标和字符串,我们从中支持多种区域性

我们使用以下代码访问解决方案中任何项目的资源

private ResourceManager ResMan;
ResMan = new ResourceManager("libResx.Resource", Assembly.ReflectionOnlyLoad("libResx"));
然后我们使用访问资源的任何元素

btnClose.Text = ResMan.GetString("btnClose");
除了缺少资源DLL外,是否存在任何可能导致反射无法找到资源DLL(程序集)的情况。到目前为止,在测试中它是完美的,当它最终部署到野外时,我们是否应该知道什么


反射会失败吗?

查看每个API的参考文档,查看每个API可以引发的异常列表。

根据我的经验,我发现指定完整路径比依赖程序集名称更可靠。您可以改用
汇编.ReflectionOnlyLoadFrom

它可能会失败。您可以对程序集进行属性化,以防止来自同一名称空间之外的另一个程序集的反射。

反射非常有用,但也可能由于更实际的原因而失败

我最近在一个MVC Web应用程序(Castle MVC、Windsor、Brail&Boo)中遇到过这种情况。当boo脚本编译并访问propertybag中的列表时,它使用反射来标识MyModel的签名,这样它就可以引用视图的属性

在此实例中,反射失败的地方是MyModel的旧数据库记录不再与新模型同步,因为旧数据对于MyModel的某些新属性或属性具有空值。对于在新属性字段中有值的新记录,这不是问题

一般来说,我会将程序集注册为依赖项,并将名称空间放在using子句中。这在编译时为编译器提供了清晰的依赖链。它还使其他开发人员更容易识别特定库所依赖的内容,而不必费力地在代码堆中查找对外部dll的隐藏Assembly.Reflection.OnLoad调用

此外,如果您希望ResourceManager有很大的变化,您应该考虑完全独立地将其分离到一个单独的dll中。(符合坚实的面向对象设计原则)。这使您的应用程序更加模块化,如果您需要更新资源程序集,则只需重新编译受影响的库