我需要在运行时扩展各种类型的实例。大多数情况下,我需要使用原始类型的实例,但在一些情况下,我需要创建一种扩展封装器来添加一些上下文信息。类似于以下示例(这实际上不是有效的.NET / C#代码...但它说明了问题):
public abstract class BaseClass
{
// ...
}
public class Concrete1: BaseClass
{
// ...
}
public class Concrete2: BaseClass
{
// ...
}
public class WrapperExtender<T>: T // Extending from T here is actually invalid!
where T: BaseClass
{
public WrapperExtender(T extensionTarget)
{
m_extensionTarget = extensionTarget;
}
private readonly T m_extensionTarget;
public object ContextualReference { get; }
public int ContextualValue { get; }
// DERP: Would need to implement overrides of T here...buuut...can't...
}
// In use, special case:
var instance = new Concrete1();
var extendedInstance = new WrapperExtender(instance);
var processor = new SomeProcessorRequiringExtendedInstance();
processor.DoProcessing(extendedInstance);
另一个例子可能是Microsoft Entity Framework v4.0或nHibernate。这两个框架都提供了动态扩展实体类型的实例,将它们在内部包装起来,以便在运行时提供必要的钩子,以使数据/对象/会话上下文随着对实体实例所做的更改而保持最新状态。我的需求并不复杂,如果有一种方法可以以某种方式混合泛型和动态类型,则上面的泛型方案将非常完美。
无论如何,我希望有人知道如何实现上述场景。或者,更好的是,有人知道更好的解决方案。我不太喜欢在运行时动态扩展类型的想法(它在EF / nHibernate场景中没有那么多意义)。目前,这是我真正能想到的唯一一件事情,它将为我提供每个传递到DoProcessing中的类型的处理器所需的信息。