How to pass properties to a method in another namespace
我已经定义了一些设置,并计划在我的vs 2008 c_wpf项目中定义更多。我知道可以在设计时通过设置设计器在项目中指定设置。我还知道可以在运行时检索和设置这些设置。不过,我想做的是能够从其他程序集和项目访问设置。
我不明白如果不写一门新课怎么办。由于设置类是在根命名空间中定义的,因此在不创建循环引用的情况下,我无法直接从其他程序集访问设置(如果尝试向已引用该项目的项目添加引用,则会发生这种情况)。有没有一种方法可以传递属性而不必创建具有完全相同属性定义的重复类?
- 很可能,正确和最好的方法是创建一个包含属性定义的类。参见en.wikipedia.org/wiki/data_transfer_对象
- 我不明白你的问题。NAMSpace与可访问性没有任何关系,因为您可以添加using语句来导入命名空间,或者只提供完全限定的命名空间global::Some.Namespace.Path.MySettingsClass.SomeSettingsProperty。
- 你是说程序集而不是名称空间吗?
- @罗伯特哈维-谢谢。你可能是对的。我看不到其他的方法。
- @戴-我试过你关于使用全局语句的建议,但如果不指定引用,它就不起作用。IntelliSense没有显示任何其他程序集或命名空间,当我尝试指定一个程序集或命名空间时,它生成了一个错误-在全局命名空间中找不到类型或命名空间名称(是否缺少程序集引用?)
- @凯罗尔斯-谢谢你的澄清。我编辑了这个问题来反映这一点。
- 您试图从项目中读取表单引用的程序集是否正确?或者它是在某个地方的任意程序集,而您只是想在不实际使用代码的情况下读取它?
- @caerolus-我有程序集A,它是定义settings.settings文件的主要WPF项目。它已经引用了程序集B,它是较低级别的程序集之一。B程序集是我要访问设置的位置。它不允许我这样做,因为如果我尝试使用a作为b的引用,它将创建一个循环依赖项。如果Microsoft设计了属性设置,并将大部分功能放在一个较低级别的类中,该类可以很容易地包含在任何程序集中,可能是某种字典。
- 啊,循环依赖……你试过我发布的代码了吗?另一个选项是创建一个仅用于设置的第三个项目,并从A和B使用它
我理解您试图从项目中未引用的程序集读取属性。在这种情况下,反思就是答案。
从该程序集中读取信息,无论dll在哪里。加载Settings类,获取Default设置,并访问所需的参数。
例如,我有一个名为se2.dll的dll,其中一个参数我通常访问为:
1
| string parameterValue = se2.Settings2.Default.MyParameter; |
现在,从另一个项目中,我必须使用这样的反射:
1 2 3 4 5 6 7 8 9
| // 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); |
- 我没有考虑过用反省。这是一个值得探索的好主意。我的应用程序是一个实时应用程序,但是它关注性能,所以我不确定代码是否需要使用后期绑定。我从我过去读到的资料中知道,有时你可以选择它是使用早期还是后期装订。我也读到过,房地产发展缓慢,杰弗里·里克特不太喜欢它们——stackoverflow.com/questions/694711/…
- 属性比字段慢(稍微慢一点),因为设置文件生成属性:-)
- 顺便问一句,关于效率:你不就看一次设置吗?可能在应用程序启动时?也许设置自动生成的代码在这里不是最好的。
- 好吧,一旦项目设置为使用设置文件,它会在程序启动时自动读取它们。所以,当这样的代码被写入时-string addr=properties.settings.default.lobbyaddress;它会获取值,而不需要我编写任何代码来加载它们。所以,我想我会写一个单独的类来存储它们。谢谢你的帮助。