C# 创建具有扩展的泛型复制方法

C# 创建具有扩展的泛型复制方法,c#,generics,C#,Generics,上下文:这是针对一个引擎,它充满了泛型类,因此未来的用户可以扩展行为的某些部分,而不必关心引擎本身的内部工作 现在,我需要一个C类: public class C { public C Copy(params) { ... } } 同时也是D类的扩展: public class D : C { public D Copy(params) { ... } } 基本上我有一些泛型类,但我需要一个copy方法(实际上是一个“在新位置复制”方法,但这并不重要),它返回正确的类型 pu

上下文:这是针对一个引擎,它充满了泛型类,因此未来的用户可以扩展行为的某些部分,而不必关心引擎本身的内部工作

现在,我需要一个C类:

public class C
{
    public C Copy(params) { ... }
}
同时也是D类的扩展:

public class D : C
{
    public D Copy(params) { ... }
}
基本上我有一些泛型类,但我需要一个copy方法(实际上是一个“在新位置复制”方法,但这并不重要),它返回正确的类型

public class SampleClass<T>
    where T : C
{
    public void Stuff()
    {
        ...
        T copy = favoriteThing.Copy(params);
        ...
    }
}
公共类SampleClass
其中T:C
{
公共物品
{
...
T copy=favoriteThing.copy(参数);
...
}
}

等等。我可以直接使用它,并相信未来的实现者会正确地使用它,但我更愿意通过合同将其明确化。有什么优雅的方法可以做到这一点吗?

一种方法可能是定义一个由
C
D
实现的
ICopyable
接口:

public interface ICopyable<T>
{
    T Copy(params);
}

public class C : ICopyable<C> { ... }
public class D : C, ICopyable<D> { ... }

我想到了这一点,但这不是让复制的调用变得模棱两可吗?不:如果
t
D
,那么上面的代码将调用
D.Copy
,而不是
C.Copy
,因为只有
D.Copy
实现了
ICopyable
。哦,我明白了。通过将favoriteThing注册为可复制图标,而不仅仅是一个T,该调用将得到修复。聪明!很抱歉,我以前没有注意到这个调整。接受并投票表决,谢谢:)
public class SampleClass<T>
    where T : C, ICopyable<T> // added constraint
{
    public void Stuff()
    {
        T favoriteThing = ...
        ...
        ICopyable<T> copyable = favoriteThing;
        T copy = copyable.Copy(params); // no cast needed
        ...
    }
}