これは何年もの間、私にとってフラストレーションの原因でした。あるクラスが別の基本クラスを継承するか、別の基本クラスから派生する場合、シグネチャが基本クラスを戻り値として指定するメソッドから返される可能性があることを理解していました。定義により、派生クラスは基本クラスでもある必要があるため、問題はないはずです。これは私にとってはうまくいかず、私にとってはうまくいかなかったので、なぜこれが間違っているのか、そして「正しい」解決策が何であるかを理解するのではなく、常に回避策を探してきました.
public abstract class Contract
{
[Key]
[DataMember]
[Column("Id")]
public Int64 Id { get; set; }
[DataMember]
[Column("ContactName")]
[DataType(DataType.Text)]
public String ContactName { get; set; }
[DataMember]
[DataType(DataType.EmailAddress)]
[Column("ContactEmail")]
public String ContactEmail { get; set; }
[DataMember]
[DataType(DataType.Text)]
[Column("ContactAddress1")]
public String ContactAddress1 { get; set; }
... More properties
}
public class StorageContract : Contract
{
[DataMember]
[Column("BoatMaxWidth")]
public Decimal? BoatMaxWidth { get; set; }
[DataMember]
[ColumnAttribute("WidthUOM")]
[DataType(DataType.Text)]
public String WidthUOM { get; set; }
[DataMember]
[Column("LaunchDate")]
[DataType(DataType.Date)]
public DateTime? LaunchDate { get; set; }
[DataMember]
[Column("TotalCharge")]
public Decimal? TotalCharge { get; set; }
... More properties
}
public class RentalContract : Contract
{
[DataMember]
[Column("BoatMake")]
public String BoatMake { get; set; }
[DataMember]
[Column("BoatYear")]
public Int32? BoatYear { get; set; }
[DataMember]
[Column("BoatBeam")]
public Decimal? BoatBeam { get; set; }
[DataMember]
[Column("BoatType")]
[DataType(DataType.Text)]
public String BoatType { get; set; }
... More properties
}
では、なぜこれが機能しないのでしょうか...
public List<Contract> lvContractList_GetData()
{
List<Contract> ret = null;
switch (Request.QueryString["type"].ToLower())
{
case "storage":
ret = ContractRepository2.GetAllContracts<StorageContract>().ToList();
break;
case "rental":
ret = ContractRepository2.GetAllContracts<RentalContract>().ToList();
break;
}
}
return ret;
}
StorageContract と RentalContract は両方とも、それらを Contract オブジェクトにする Contract クラスから派生します。
なぜ私はこれを行うことができないのですか?