错误应用程序在WPF中转换

时间:2011-06-29 11:45:50

标签: wpf casting

我的解决方案中有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; }
}

请协助......

3 个答案:

答案 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中的那个(以及它的相关资源)将在运行时创建。