2016-11-23 120 views
0

我正在實施一個ConvertingCollection,它旨在提供轉換項目(B)的集合,並給出原始項目(A)的實時集合。集合B將反映集合A中發生的任何更改。目標是在MVVM中將它用作給定模型集合的ViewModel的集合,但我相信它可以用於許多不同的上下文中。ivalueconverter vs system.converter vs delegate

該類需要用戶提供將對象從A類型轉換爲B類型的方法。我可以找到幾種繼續進行的方法,但我不知道它們的區別,以確定什麼是最佳方法:

  • 我可以要求一個IValueConverter,這似乎是WPF相關。現在,沒有什麼可以阻止在其他地方使用它,但它可能會令人困惑。儘管我的類首先打算在WPF上下文中使用,但它足以應用於許多其他上下文。另外,IValueConverter可以從一個對象轉換爲對象,這意味着向下遊投射,並且在構建時不會崩潰。

  • 我可以選擇System.Converter。這允許使用async,甚至更令人愉快,我可以要求特定的類型。另外,就我所知,這在人們的腦海裏並不是WPF相關的。

  • 最後,我可以和一個代表一起做TypeIn => TypeOut。沒有類需要實例化,強類型化,用戶可以使用任何IValueConverter,Converter或自定義函數來實現委託。

現在,我不知道爲什麼,當一切都可以用僅委派處理的ConverterIValueConverter存在。所以我想我錯過了那裏的東西。

任何人都可以請幫忙嗎? 在此先感謝, 致以問候

回答

0

最好的辦法:這兩個抽象轉化爲各自的類型,它使得編寫實際的實例轉換絕對瑣碎

  • 讓用戶決定是否通過使用IValueConverterConverter實施提供兩種可能性的課程。
  • 該lambda超出範圍,因爲lambda表達式是在用戶端用來輕鬆提供委託實現。這意味着ConvertingCollection會期望委託人作爲參數,這是Converter已經是。
  • 最後,主意,用的隱式轉換不會保留,因爲:
    • 它迫使用戶提供,只能在ConvertingCollection使用的唯一的前後關係的任何地方,而不是應用轉換,這可能是問題有時
    • 在一個隱式轉換適用的情況下,是很容易在一個lambda表達式
    • 它使ConvertingCollection更復雜的實現(檢查2種類型的A和B之間存在的隱式轉換)來使用它,我對此太懶惰了。好的,這可能是第一個原因,但其他兩個仍然有效。 :)

我希望這有助於。

0

我不知道所有堅韌的細節,但您也可以使用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(); 
    } 
} 
+0

好點,我沒有想到這個選項。儘管如此,這意味着轉換將適用於所有用戶的項目,而不僅僅是在使用我的課程時......我將編輯我的主要信息以告知更多關於上下文的內容。 –

相關問題