我的解决方案中有2个项目(主要是A.WPF,次要是B.WPF)
当我试图访问B.WPF中的App.xaml.cs中的变量时:
filename = ((App)Application.Current).ErrorLogFileName;
我收到以下错误:
Unable to cast object of type 'A.App' to type 'B.App'.
我也尝试了以下内容:
filename = ((B.App)Application.Current).ErrorLogFileName;
但仍然是同样的错误...
B.App中的定义是:
private string _errorLogFileName = "error log.xml";
public string ErrorLogFileName
{
get { return _errorLogFileName; }
}
请协助......
答案 0 :(得分:1)
看起来你需要这样做:
filename = ((A.App)Application.Current).ErrorLogFileName;
错误是该类型为A.App
,但在这两种情况下,您都试图转换为B.App
。
目前只能有一个应用程序。
答案 1 :(得分:0)
Application.Current
指的是当前的应用程序。允许将当前App转换为另一个App类型的唯一方法是当另一个App类型是当前App类型的基类时。
A.App和B.App的兄弟姐妹或B.App是A.App的基类吗?
答案 2 :(得分:0)
如果你不希望B有一个对A的引用(或者你不希望A引用B并且这会引起循环引用),那么你需要在第三个程序集中定义的公共类型A和B参考。在我们的实现中,我们倾向于在两个Wpf项目引用的单独项目中使用ConfigurationData类型,例如
public static class ConfigurationData
{
private static string _errorLogFileName = "error log.xml";
public string ErrorLogFileName
{
get { return _errorLogFileName; }
}
}
另一种方法是在第三个程序集中为A和B引用的ErrorLogFileName属性定义一个接口,然后在Wpf Application类上实现该接口 - 然后A和B都能够转换为该类型。如果您希望A项目在运行时设置其值,则可以将ErrorLogFileName设置为读写属性,并在应用程序启动时对其进行初始化。
我个人更喜欢在Wpf app对象中使用单独的ConfigurationData类型来处理这种东西(ErrorLogFileName等),因为它也可以用于可能在单元测试中执行的代码,因此可能不会在Wpf应用程序 - 它还避免了必须在所有地方进行强制转换(ConfigurationData.ErrorLogFileName
而不是((IAppConfigurationData)Application.Current).ErrorLogFileName
。
顺便说一句,如果两个程序集中都有一个Application对象,那么您可能会将两个程序集配置为在项目属性中构建为输出类型:Windows应用程序。您应该只有一个配置为Windows应用程序的程序集,其余部分应该是类库,以避免混淆正在生成的应用程序类的数量 - 只有主EXE中的那个(以及它的相关资源)将在运行时创建。