【问题标题】:Should I combine interface implementations using reflection (C#)?我应该使用反射(C#)组合接口实现吗?
【发布时间】:2016-11-24 13:27:12
【问题描述】:

我将介绍我的情况的一个简化案例。

所以,我在 MyClass 类型中进行了一些转换

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

因为转换确实不同,所以将它们提供为 ITransformer 的不同实现是非常有意义的。

但是,现在需要获得所有可能转换的组合结果。像GlobalTransformer : ITransformer 这样的Transform 方法调用所有其他实现并组合它们的结果......

这有意义吗?我应该使用反射吗?还是我应该以不同的方式解决问题?

【问题讨论】:

  • @GrantWinney 我展示了基本思想,没有特定于上下文的混乱。而组合实现的方式(在列表中,使用反射或其他)是我现在正在尝试决定的。

标签: c# reflection interface


【解决方案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

我也强烈避免反射,因为它很慢。

【讨论】:

    【解决方案2】:

    你不可能知道所有可能的转换。引用您的库的项目可以创建它自己的 ITransformer 实现,而您永远不会知道它。

    即使你可以:我怀疑你甚至了解它们:如果你在单元测试中创建一个TestTransformer,你真的想盲目地应用它吗?

    相反,我会手动跟踪所有转换器的实现 - 在最简单的情况下,您只需使用包含每个转换器的一个实例的 List&lt;ITransformer&gt;

    【讨论】:

    • 感谢您的回答。所提供的想法是有效的并且非常有趣。我最终接受了其他答案,因为它提供了跟踪 List&lt;ITransformer&gt; 的原型代码,这在我的情况下似乎是一种方法。
    猜你喜欢
    • 2015-10-21
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多