我可以使用代码契约来解决无法具有泛型构造函数约束的问题吗?

本文关键字:构造函数 泛型 约束 问题 代码 可以使 契约 解决 我可以 | 更新日期: 2023-09-27 18:10:23

我正在编写一个类,它将创建另一个类的不可变副本,我这样做的方式要求副本接受构造函数中原始类的日期和实例。我知道您不能创建指定参数的构造函数约束,但是是否有一种方法可以使用代码契约来解决它?

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
    }
}

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

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

我可以使用代码契约来解决无法具有泛型构造函数约束的问题吗?

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

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)); 
}

}