c# - 我可以使用代码契约来解决无法使用通用构造函数约束的问题吗?

标签 c# generics code-contracts

我打算编写一个类来创建另一个类的不可变副本,而我这样做的方式要求副本在构造函数中获取日期和原始实例。我知道您不能创建指定参数的构造函数约束,但是有没有办法使用代码契约来解决这个问题?

public class Copier<o, c>
    where o : class, INotifyPropertyChanged
    where c : class, c // ideally new(datetime, o)
{
    private Dictionary<DateTime, c> copies;

    public Copier(o original)
    {
        this.copies = new Dictionary<DateTime, c>();
        original.PropertyChanged += 
            this.propertyChangedHandler(object sender, PropertyChangedEventArgs args);
    }

    private void propertyChangedHandler(object sender, PropertyChangedEventArgs args)
    {
        var original = sender as o;
        var now = DateTime.Now;
        this.copies.Add(now, new c(now, original)); // error here
    }
}

复制类是我创建的,继承自原始类,将所有属性覆盖为只读,并在构造函数中复制原始类的值。

注意:有一个要求(由我强加)不能修改原始对象。

最佳答案

按照建议,传递一个创建委托(delegate):

public class Copier<o, c>
    where o : class, INotifyPropertyChanged
    where c : class, c // ideally new(datetime, o)
{
private Dictionary<DateTime, c> copies;
private Func<o, DateTime, c> copyFunc;

public Copier(o original, Func<o, DateTime, c> copyFunc)
{
    this.copyFunc = copyFunc;
    this.copies = new Dictionary<DateTime, c>();
    original.PropertyChanged += 
        this.propertyChangedHandler(object sender, PropertyChangedEventArgs args);
}

private void propertyChangedHandler(object sender, PropertyChangedEventArgs args)
{
    var original = sender as o;
    var now = DateTime.Now;
    this.copies.Add(copyFunc(now, original)); 
}

关于c# - 我可以使用代码契约来解决无法使用通用构造函数约束的问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7636302/

相关文章:

java - 为什么 Java(但不是 .NET)无法在不需要原始类型/类型删除的情况下适应泛型?

c# - 代码契约(Contract) : Ensures Unproven & Requires Unproven

c# - 使 Contract.Assert 抛出异常而不是显示对话框

c# - 代码契约(Contract)和任务

c# - 基于 asp.net mvc 和 azure Active Directory 安全组的授权

C#:wpf 将组合框项添加到多个组合框

C# - 确定存储过程是否存在

c# - 在 C# 中定义 F# '**' 运算符

java - 为什么数组是协变的,而泛型是不变的?

java - 通用对象参数的类型问题