2016-11-24 41 views
2

我將介紹一下我的情況。我應該使用反射(C#)結合界面實現嗎?

所以,我正在做內MyClass

public interface ITransformer 
{ 
    List<MyClass> Transform(MyClass item); 
} 

因爲轉換是真的不同了一些變革,它非常有意義,爲他們提供的ITransformer爲不同的實現。

但是,現在需要有所有可能轉換的組合結果。像GlobalTransformer : ITransformerTransform方法調用所有其他實現並組合它們的結果...

它是否有意義?我應該使用反射嗎?或者我應該以不同的方式解決問題?

+0

你打算如何跟蹤所有實現'ITransformer'類的實例?他們在列表中嗎?是否有任何其他代碼可以向我們展示可幫助說明問題的代碼? –

+0

@GrantWinney我展示了沒有上下文特定混亂的基本思想。而實現的組合方式(在列表中,使用反射或其他)是我現在想要決定的。 – Pranasas

回答

1

我會走那條路:

public class GlobalTransformer : ITransformer 
{ 
    private readonly IList<ITransformer> _availableTransformers; 

    public GlobalTransformer(IList<ITransformer> availableTransformers) 
    { 
     _availableTransformers = _availableTransformers; 
    } 

    public List<MyClass> override Transform(MyClass item) { 
     List<MyClass> result = new List<MyClass>(); 
     foreach (var item in _availableTransformers) { 
      result.AddRange(item.Transform(item)); 
     } 
     return result; 
    } 
} 

我會再往前走一步,使用IoCAutofacSimpleInjector注入該列表您GlobalTransformer

我也想極力避開反思它很慢。

1

你無法知道所有可能的轉換。一個引用你的庫的項目可以創建它自己的ITransformer實現,你永遠不會知道它。

而且,即使你可以:我懷疑,你甚至瞭解他們:如果您在您的單元測試TestTransformer,你真的要盲目地應用它?

相反,我會手動跟蹤所有的變壓器實現 - 在最簡單的情況下,您只需使用一個List<ITransformer>包含每個變壓器的一個實例。

+0

感謝您的回答。提供的想法是有效的和非常有趣的。我最終接受了其他答案,因爲它給出了追蹤'List '的原型代碼,這似乎是我的情況。 – Pranasas