ivalueconverter vs system.converter vs 委托
ivalueconverter vs system.converter vs delegate
我正在实施一个 ConvertingCollection,其目的是在给定原始项目 (A) 的实时集合的情况下提供转换项目 (B) 的集合。集合 B 将反映集合 A 中发生的任何更改。目标是在 MVVM 中将其用作给定模型集合的 ViewModel 集合,但我相信它可以在许多不同的上下文中使用。
这 class 要求用户提供一种将对象从类型 A 转换为类型 B 的方法。我可以找到几种方法来继续,但我对它们的差异了解不够,无法做出决定什么是最好的方法:
我可以求一个IValueConverter
,好像是WPF相关的。现在,没有什么可以阻止在其他地方使用它,但它可能会造成混淆。尽管我的 class 最初打算在 WPF 上下文中使用,但它足够通用以适用于许多其他上下文。此外,IValueConverter
从对象到对象的转换,这意味着向下游转换,并且在构建时不会崩溃。
我可以选择 System.Converter
。这允许使用 async
,更令人愉快的是,我可以询问特定类型。另外,据我所知,人们认为这与 WPF 无关。
最后,我可以让委托人执行 TypeIn => TypeOut。没有 class 实例化,强类型,用户可以使用任何 IValueConverter、Converter 或自定义函数来实现委托。
现在,我不知道为什么 Converter
和 IValueConverter
存在,而所有事情都可以只用代表来处理。所以我想我在那里遗漏了一些东西。
有人可以帮忙吗?
提前致谢,
最好的问候
我不知道所有细节,但您也可以使用 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这两种类型之间是否存在隐式转换),我懒得做这个了。好的,这可能是第一个原因,但其他两个仍然有效。 :)
希望对您有所帮助。
我正在实施一个 ConvertingCollection,其目的是在给定原始项目 (A) 的实时集合的情况下提供转换项目 (B) 的集合。集合 B 将反映集合 A 中发生的任何更改。目标是在 MVVM 中将其用作给定模型集合的 ViewModel 集合,但我相信它可以在许多不同的上下文中使用。
这 class 要求用户提供一种将对象从类型 A 转换为类型 B 的方法。我可以找到几种方法来继续,但我对它们的差异了解不够,无法做出决定什么是最好的方法:
我可以求一个
IValueConverter
,好像是WPF相关的。现在,没有什么可以阻止在其他地方使用它,但它可能会造成混淆。尽管我的 class 最初打算在 WPF 上下文中使用,但它足够通用以适用于许多其他上下文。此外,IValueConverter
从对象到对象的转换,这意味着向下游转换,并且在构建时不会崩溃。我可以选择
System.Converter
。这允许使用async
,更令人愉快的是,我可以询问特定类型。另外,据我所知,人们认为这与 WPF 无关。最后,我可以让委托人执行 TypeIn => TypeOut。没有 class 实例化,强类型,用户可以使用任何 IValueConverter、Converter 或自定义函数来实现委托。
现在,我不知道为什么 Converter
和 IValueConverter
存在,而所有事情都可以只用代表来处理。所以我想我在那里遗漏了一些东西。
有人可以帮忙吗? 提前致谢, 最好的问候
我不知道所有细节,但您也可以使用 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这两种类型之间是否存在隐式转换),我懒得做这个了。好的,这可能是第一个原因,但其他两个仍然有效。 :)
- 它强制用户提供一个可以在任何地方应用的转换,而不仅仅是在使用
希望对您有所帮助。