错误WPF中的应用程序强制转换



我的解决方案中有两个项目(主要是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.应用程序中的定义是:

private string _errorLogFileName = "error log.xml";
public string ErrorLogFileName
{
    get { return _errorLogFileName; }
}

请协助。。。

看起来你需要做:

filename = ((A.App)Application.Current).ErrorLogFileName;

错误是说类型是A.App,但在这两种情况下,您都试图强制转换为B.App

也只能有一个当前应用程序。

Application.Current是指当前应用程序。当其他应用程序类型是当前应用程序类型的基类时,才允许将当前应用程序强制转换为另一种应用程序类型。

A.App和B.App是兄弟姐妹还是B.App是A.App的基类?

如果你不希望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应用程序类上实现该接口——然后a和B可以强制转换为该类型。如果您希望A项目在运行时设置其值,可以将ErrorLogFileName改为读写属性,并在应用程序启动时对其进行初始化。

我个人更喜欢使用来自Wpf应用程序对象的单独ConfigurationData类型来处理这类内容(ErrorLogFileName等),因为它也可以用于可能在单元测试中执行的代码,因此可能不会在Wpf应用软件下运行-它还避免了到处进行强制转换(ConfigurationData.ErrorLogFileName而不是((IAppConfigurationData)Application.Current).ErrorLogFileName)。

顺便说一句,如果两个程序集中都有一个应用程序对象,听起来可能两个程序集都配置为在项目属性中生成输出类型:Windows应用程序。您应该只有一个程序集被配置为Windows应用程序,其余的应该是类库,以避免生成的应用程序类数量混乱-只有主EXE(及其相关资源)中的一个会在运行时创建。