ivalueconverter vs system.converter vs 委托

ivalueconverter vs system.converter vs delegate

我正在实施一个 ConvertingCollection,其目的是在给定原始项目 (A) 的实时集合的情况下提供转换项目 (B) 的集合。集合 B 将反映集合 A 中发生的任何更改。目标是在 MVVM 中将其用作给定模型集合的 ViewModel 集合,但我相信它可以在许多不同的上下文中使用。

这 class 要求用户提供一种将对象从类型 A 转换为类型 B 的方法。我可以找到几种方法来继续,但我对它们的差异了解不够,无法做出决定什么是最好的方法:

现在,我不知道为什么 ConverterIValueConverter 存在,而所有事情都可以只用代表来处理。所以我想我在那里遗漏了一些东西。

有人可以帮忙吗? 提前致谢, 最好的问候

我不知道所有细节,但您也可以使用 implicit 运算符。这两者都将转换抽象为各自的类型,并且使编写实际的实例转换变得非常简单:

A myA = new A();
//implicit conversion happens here
B myB = myA;

class A
{
    public static implicit operator A(B b)
    {
        //TODO - Convert b to a new A
        return new A();
    }
}

class B
{
    public static implicit operator B(A a)
    {
        //TODO - Convert a to a new B
        return new B();
    }
}

我认为最好的方法:

  • 让用户决定是使用 IValueConverter 还是 Converter,方法是实现一个提供两种可能性的 class。
  • lambda 超出范围,因为 lambda 表达式用于在用户端轻松提供委托实现。这意味着 ConvertingCollection 需要一个委托作为参数,而 Converter 已经是这样了。
  • 最后,没有保留使用隐式转换的想法,因为:
    • 它强制用户提供一个可以在任何地方应用的转换,而不仅仅是在使用 ConvertingCollection 的唯一上下文中,这有时可能会出现问题
    • 如果应用隐式转换,在 lambda 表达式中使用它很容易
    • 它使ConvertingCollection的实现更加复杂(检查A和B这两种类型之间是否存在隐式转换),我懒得做这个了。好的,这可能是第一个原因,但其他两个仍然有效。 :)

希望对您有所帮助。