有没有办法使用具有相同名称但在派生类中具有不同类型的属性?

我有使用BaseClass的遗留代码,代码期望customerid是int类型。 然后我需要创建一个新类DerivedClass,它的行为与BaseClass非常相似,但现在customerid需要是一个字符串。 无法修改遗留代码,因此不需要进行测试。

如何使用inheritance(或任何其他方式)获得我想要的效果?

下面的Linqpad测试代码说明了我需要做什么。 显然它不会编译,因为DerivedClass中的customerid需要为int。 我还需要一个名为customerid的字符串属性。 它必须是该名称,因为其他代码将使用此类而不是BaseClass,并期望相同的命名属性为string类型。

public class BaseClass { public virtual int customerid {get; set;} public void printname() { customerid = 1; customerid.Dump(); } } public class DerivedClass : BaseClass { public override string customerid {get; set;} public void PrintCustomerID() { customerid = "jshwedeX"; customerid.Dump(); } } void Main() { DerivedClass dc = new DerivedClass(); dc.printname(); } 

你可以像这样使用new修饰符:

 public class BaseClass { public virtual int customerid {get; set;} public void printname() { customerid = 1; customerid.Dump(); } } public class DerivedClass : BaseClass { public new string customerid {get; set;} public void PrintCustomerID() { customerid = "jshwedeX"; customerid.Dump(); } } 

这将为您提供所需的结果,但它也会隐藏基类的属性。 如果您将DerivedClass的实例DerivedClassBaseClass变量,那么您只能在基类上引用该属性; 不是派生类。

换一种说法:

 BaseClass instance = new DerivedClass(); string customerId = instance.customerid; // <- this won't compile 

另一种方法是使用显式接口实现:

 public interface IBase { int customerid { get; set; } } public interface IDerived { string customerid { get; set; } } public class Derived : IBase, IDerived { int IBase.customerid { get; set; } string IDerived.customerid { get; set; } } 

当您的Derived实例存储在IBase类型的变量中时, customerid将解析为int版本,当它存储在IDerived类型的变量中时,它将解析为string版本:

 var derived = new Derived(); IBase ibase = derived; IDerived iderived = derived; int id1 = ibase.customerid; // <- compiles just fine string id2 = iderived.customerid; // <- compiles just fine 

你也可以使用cast:

 var instance = new Derived(); int id1 = ((IBase)instance).customerid; string id2 = ((IDerived)instance).customerid; 

请记住,除非变量属于接口类型,否则显式接口实现会导致实现的成员不可见:

 var instance = new Derived(); var customerid = instance.customerid; // <- this won't compile