【问题标题】:How to pass properties to a method in another namespace如何将属性传递给另一个命名空间中的方法
【发布时间】:2013-03-25 22:04:55
【问题描述】:

我已经定义了一些设置,并计划在我的 VS 2008 C# WPF 项目中定义更多。我知道可以在设计时通过设置设计器在项目中指定设置。我也知道可以在运行时检索和设置设置。我想做的是能够访问其他程序集和项目的设置。

如果不编写新类,我不明白如何做到这一点。由于设置类是在我的根命名空间中定义的,因此我无法在不创建循环引用的情况下直接从其他程序集中访问设置(如果您尝试添加对已经引用该项目的项目的引用,则会发生这种情况)。有没有办法传递属性而不必创建具有完全相同属性定义的重复类?

【问题讨论】:

  • 很可能,正确和最好的方法是创建一个包含属性定义的类。见en.wikipedia.org/wiki/Data_transfer_object
  • 我不明白你的问题。命名空间与可访问性没有任何关系,因为您可以添加 using 语句来导入命名空间,或者只提供完全限定的命名空间 global::Some.Namespace.Path.MySettingsClass.SomeSettingsProperty
  • 你的意思是不是程序集而不是命名空间?
  • @RobertHarvey - 谢谢。你可能是对的。我没有看到任何其他方式。
  • @Dai - 我尝试了使用 global 语句的建议,但如果不指定引用,它将无法工作。 Intellisense 没有显示任何其他程序集或命名空间,当我尝试指定一个时,它产生了错误 - 在全局命名空间中找不到类型或命名空间名称(您是否缺少程序集引用?)

标签: c# properties namespaces


【解决方案1】:

我了解到您正在尝试从您的项目中未引用的程序集中读取属性。在这种情况下,reflection 就是答案。

从该程序集读取信息,无论dll 在哪里。加载Settings 类,获取Default 设置,并访问您想要的参数。

例如,我有一个名为 se2.dll 的 dll,带有一个我通常会访问的参数:

string parameterValue = se2.Settings2.Default.MyParameter;

现在,在另一个项目中,我必须像这样使用反射:

// load assembly
 System.Reflection.Assembly ass = System.Reflection.Assembly.LoadFrom(@"M:\Programming\se2\se2\bin\Debug\se2.exe");
// load Settings2 class and default object
Type settingsType = ass.GetType("se2.Settings2");
System.Reflection.PropertyInfo defaultProperty = settingsType.GetProperty("Default");
object defaultObject = defaultProperty.GetValue(settingsType, null);
// invoke the MyParameter property from the default settings
System.Reflection.PropertyInfo parameterProperty = settingsType.GetProperty("MyParameter");
string parameterValue = (string)parameterProperty.GetValue(defaultObject, null);

【讨论】:

  • 我没有考虑过使用反射。这是一个值得探索的好主意。我的应用程序是一个实时应用程序并且关注性能,所以我不确定代码是否必须使用后期绑定。我从过去读过的内容中知道,有时您可以选择是使用早期绑定还是后期绑定。我也一直在读到属性很慢,Jeffery Richter 不太喜欢它们 - stackoverflow.com/questions/694711/…
  • 属性比字段(稍微)慢一点在这里并不适用,因为设置文件会生成属性:-)
  • 顺便说一句,关于效率:您不会只阅读一次设置吗?可能在应用程序启动时?也许设置自动生成的代码在这里不是最好的。
  • 好吧,一旦项目设置为使用设置文件,它会在程序启动时自动读取它们。因此,当编写这样的代码时 - string Addr = Properties.Settings.Default.LobbyAddress;它无需我编写任何代码来加载它们就可以获取值。所以,我想我会写一个单独的类来存储它们。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2021-01-14
  • 1970-01-01
  • 2020-10-09
  • 1970-01-01
  • 2014-01-05
  • 1970-01-01
  • 2017-01-04
  • 2013-08-14
相关资源
最近更新 更多