Skip to main content
 首页 » 编程设计

c#-4.0之与 C# 4.0 的混合

2024年09月07日54shihaiming

我已经看到了关于是否可以在 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。您可以使用标记界面执行此操作。