我已经看到了关于是否可以在 C# 中创建 mixin 的各种问题,并且它们通常被定向到 codeplex 上的 re-mix 项目。但是,我不知道我是否喜欢“完整界面”的概念。理想情况下,我会像这样扩展一个类:
[Taggable]
public class MyClass
{
....
}
通过简单地添加 Taggable 接口(interface),我可以通过某种对象工厂创建 MyClass 类型的对象。返回的实例将具有 MyClass 中定义的所有成员以及通过添加标记属性(如标记集合)提供的所有成员。使用 C# 4.0(动态关键字)似乎很容易做到这一点。重新混合项目使用 C# 3.5。有没有人有任何通过 C# 4.0 扩展对象而不改变类本身的好方法?谢谢。
请您参考如下方法:
您可以在 C# 4.0 中创建类似 mixin 的构造,而无需使用动态,在接口(interface)上使用扩展方法和 ConditionalWeakTable
类来存储状态。看看here为了这个想法。
这是一个例子:
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;
}
}
像这样使用它:
class Order : MNamed { // you can list other mixins here...
...
}
...
var o = new Order();
o.SetName("My awesome order");
...
var name = o.GetName();
使用属性的问题是您不能将泛型参数从类传递到 mixin。您可以使用标记界面执行此操作。