表达显然不会返回正确的值

时间:2014-09-06 18:17:26

标签: wpf reflection binding expression

我的应用程序使用MarkupExtensions来完成用户界面的自动翻译。这在运行时非常好,但在设计时并不适用。通常情况下这不是一个大问题,但是一旦你有大约40个绑定到翻译的控件,你就会看到40个错误,它们说"对象没有设置为实例。"因为翻译器没有实例化。此外,如果有翻译文本而不是"!keyname!",看看它实际上看起来真的很高兴。这有助于显着地设计用户界面。

不幸的是,我的应用程序是非常抽象和模块化的,因为我不想参考本地化程序集,我不得不做一些讨厌的技巧来启用设计时翻译。

一个类始终在使用中,并且在设计时可以安全使用。它是可以访问所有内容的Core(包括本地化程序集,但在设计时不会实例化)。所以我在Core的静态构造函数中添加了一些代码,它们查找程序集并通过Reflection / Expressions创建Translator。这显然有效,因为我在译者的构造函数中出现了异常。

但是当我尝试将转换器的实例分配给Core中的属性时,后者将用于创建设计时转换绑定,我必须注意到没有实例集。创建MarkupExtensions后,我得到一个异常,它告诉我没有设置DesignTimeTranslator。

我无法弄清楚为什么会发生这种情况,而且由于这种情况在设计时运行,我无法调试好。我对表达式的了解并不多,所以我不知道当它们执行失败时会发生什么,也不知道实际输出应该是什么(但我想它应该是ITranslator)。

if (!DesignerProperties.GetIsInDesignMode(new DependencyObject())) return;
try
{
    Assembly locA = Assembly.Load(
                                  AssemblyName.GetAssemblyName(Path.Combine(Environment.CurrentDirectory,
                                                                            "Localization.dll")));
    if (locA == null) throw new Exception("No DesignTimeTranslator assembly found.");
    Type locT = locA.GetType("Localization.Translator");
    if (locT == null) throw new Exception("DesignTimeTranslator type not found.");
    ConstructorInfo constructorInfo = locT.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance,
                                                          null, Type.EmptyTypes, null);
    if (constructorInfo == null) throw new Exception("No constructor found for DesignTimeTranslator.");
    NewExpression constrExp = Expression.New(constructorInfo);
    Func<object> constructor = Expression.Lambda<Func<object>>(constrExp, null).Compile();

    DesignTimeTranslator = (ITranslator)constructor();
    MessageBox.Show(DesignTimeTranslator != null ? DesignTimeTranslator.GetType().FullName : "No Translator :(");
}
catch (Exception ex)
{
    MessageBox.Show("[DESIGNTIME] Exception occured: {0}{1}".FormatWith(ex.Message, ex.StackTrace));
    MessageBox.Show(Path.Combine(Environment.CurrentDirectory,
                                 "Localization.dll"));
}

这是译者的构造函数:

internal Translator()
{
    bool designTime = DesignerProperties.GetIsInDesignMode(new DependencyObject());
    if (_instance != null) throw new InvalidOperationException("Can´t create another Translator instance!");
    _instance = this;

    this._languagePacks = new Dictionary<CultureInfo, LangFormat>();
}

谢谢:)

0 个答案:

没有答案