gpt4 book ai didi

c# - 在编译后将属性注入(inject) .NET 类

转载 作者:太空宇宙 更新时间:2023-11-03 19:37:26 25 4
gpt4 key购买 nike

我想在不引用 WPF 程序集的情况下实现 WPF 的 MVVM 模式的 ViewModel 部分。有问题的部分是命令路由,它要求 ViewModels 实现 ICommand 类型的属性这样命令绑定(bind)就可以工作。

现在,我可以避免 ICommand并简单地将属性声明为 object .一切仍然有效,就是这样。但令我困扰的是,我仍然必须声明它们,而且我真的不想这样做,因为它们感觉像是样板代码

我的 ViewModels 目前看起来像这样:

public class HelloWorldViewModel : ViewModel
{
[BoundProperty]
public string Name { get; set; }

[CommandHandler("SayHello")]
public bool CanSayHello()
{
return Name != "" && Name != null;
}

[CommandHandler("SayHello")]
public void SayHello()
{
View.ShowMessage("Hello, {0}!", Name);
}

public object SayHello { get; private set; }
}

CommandHandlerAttribute启用命令处理程序的运行时发现(一个 Action 和一个可选的 Func<bool> ),而 BoundPropertyAttribute确实是一个方面,它将自身注入(inject)属性 setter 并调用 INotifyPropertyChanged .我通过使用编译时 IL weaver 来实现这一点。

理想情况下,我也想隐含最后一行(SayHello 属性)。如果不是为了 WPF 的要求,将它放在源代码中是没有意义的。

所以,很自然地,我正在考虑使用 CommandHandlerAttribute方面将必要的 IL 注入(inject)到类中,并在本质上在编译后创建属性。这是相当困难的,尽管一个好的 IL 编织器(例如 PostSharp)可以大大简化它。

在开始这段旅程之前,我想听听大家对我的方法有何看法。好听吗?有没有更好的办法?你会怎么做?

最佳答案

到目前为止,对我来说这听起来太聪明了。发生了太多的“魔法”。特别是,我不喜欢您的 CommandHandlerAttribute 的神奇字符串和其他方面。也就是说,如果我沿着这条路走下去,我会使用类似于 EventAggregator 的东西,但用于命令。 IOW,SayHello 根本不会存在于您的 ViewModel 上。有什么魔法创建了与 SayHell() 和 CanSayHello() 的命令绑定(bind),而是将命令定位在全局 CommandAggregator 中。只要我们为此使用魔术字符串,就可以延迟创建 CommandAggregator 中的命令,因此不需要您进行“样板”编码。剩下的就是创建一些 XAML 魔术(标记扩展)来指定 ICommandSource 上的命令。

<Button Command="{my:AggregateCommand SayHello}"/>

关于c# - 在编译后将属性注入(inject) .NET 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/678024/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com