You can create mixin-like constructs in C# 4.0 without using dynamic, with extension methods on interfaces and the ConditionalWeakTable
class to store state. Take a look here for the idea.
Here's an example:
public interface MNamed {
// required members go here
}
public static class MNamedCode {
// provided methods go here, as extension methods to MNamed
// to maintain state:
private class State {
// public fields or properties for the desired state
public string Name;
}
private static readonly ConditionalWeakTable<MNamed, State>
_stateTable = new ConditionalWeakTable<MNamed, State>();
// to access the state:
public static string GetName(this MNamed self) {
return _stateTable.GetOrCreateValue(self).Name;
}
public static void SetName(this MNamed self, string value) {
_stateTable.GetOrCreateValue(self).Name = value;
}
}
Use it like this:
class Order : MNamed { // you can list other mixins here...
...
}
...
var o = new Order();
o.SetName("My awesome order");
...
var name = o.GetName();
The problem of using an attribute is that you can't flow generic parameters from the class to the mixin. You can do this with marker interfaces.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…