2011-10-19 55 views
0

假设我有一个抽象基类BaseClass将实例方法的参数限制为实例的类型

我想给它看起来像下面

public void CopyPropertiesFrom<T>(T source) where T == ThisDerivedClass : BaseClass 
{ 
    // ... 
} 

我想要的方法是通用的方法,而是被限制在最派生类的当前实例的。 (我的方法将使用反射,所以我实际上并不需要在任何子类中覆盖CopyPropertiesFrom,但我仍然希望编译时类型安全。)

有没有什么方法可以用有效的C#表示?

回答

1

不仅没有办法表达这一点,但编译器无论如何都不可能执行。泛型的一点是它们可以在编译时检查。你会想到这个做...

BaseClass foo = new DerivedClass(); 
foo.CopyPropertiesFrom<BaseClass>(new OtherDerivedClass()); 

编译器只知道foo作为BaseClass - 它应该怎么知道抱怨实际上,你应该打电话foo.CopyPropertiesFrom<DerivedClass>

您可以在方法内检查,当然 - 但是我不知道我甚使它通用:

public void CopyPropertiesFrom(BaseClass other) 
{ 
    if (other.GetClass() != GetClass()) 
    { 
     throw new ArgumentException("..."); 
    } 
} 
1

不,没有。你只能允许一个类和任何派生的(不相关的深度继承)。