我有需要在運行時擴展各種類型的實例。大多數情況下,我需要處理原始類型的實例,但是在某些情況下,我需要爲這些類型添加一些擴展包裝來添加一些上下文信息。沿着以下線的東西(這實際上不是有效的.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);
另外一個例子很可能是微軟實體框架V4.0,或NHibernate的。這兩個框架都提供了實體類型的動態擴展實例,將它們內部包裝起來,以便在運行時提供保持數據/對象/會話上下文所需的鉤子,以及對實體實例所做的更改。我的需求並不那麼複雜,上面的泛型方案可以很好地工作,只要有一種方法可以將泛型和動態類型混合起來。
無論如何,我希望有人知道如何實現上述情況。或者,甚至更好,有人知道更好的解決方案。我並不在乎在運行時動態擴展類型的想法(它不像EF/nHibernate場景中那麼有意義)。目前,我唯一能想到的就是它這將爲我提供我在處理器中爲每個傳入DoProcessing的類型所需的信息。
我很感興趣,你可以提供更多關於你在做什麼的細節? – 2009-08-23 07:04:10
看看下面的答案。我想出了一個完美的解決方案,保持關注點分離,並且不會篡改依賴關係。 – jrista 2009-08-23 07:15:30