通用 c# 属性 类型
Generic c# property type
我有三个 class,其中两个继承自基础 class,第三个我想根据应用程序的状态引用另外两个中的一个。
public class Batch
{
public Batch() { }
}
public class RequestBatch : Batch
{
public RequestBatch(string batchJobType) : base(batchJobType) { }
public override int RecordCount
{
get { return Lines.Count; }
}
}
public class ResponseBatch : Batch
{
public ResponseBatch(string batchJobType) : base(batchJobType) { }
public ResponseBatch(int BatchJobRunID)
{ }
}
有时我有一个实例化的Child1实例,有时我需要Child2。但是,我有一个模型,我想传递我的应用程序以将所有内容保存在一个地方,但我想要一种方法来使包含 Child1 和 Child2 的 属性 通用,例如:
public class BatchJob {
public List<Batch> Batches { get; set; }
}
然后再这样做
public List<RequestBatch> GetBatches(...) {}
var BatchJob = new BatchJob();
BatchJob.Batches = GetBatches(...);
但是,编译器对我大吼大叫,说它不能将 Child1 隐式转换为(其基类型)Parent。
我在“= GetBatches(....”下看到红色波浪线,表示“无法将类型 'System.Collections.Generic.List' 隐式转换为 'System.Collections.Generic.List'
有没有一种方法可以泛化 属性 以便它可以采用任何父类型的抽象?
谢谢!
您显示的代码片段确实有效。没有编译错误:
class Program
{
static void Main()
{
var rj = new RunningJob();
rj.Property = new Child1();
rj.Property = new Child2();
}
}
public class RunningJob {
public Parent Property { get; set; }
}
public class Parent { }
public class Child1 : Parent { }
public class Child2 : Parent { }
此代码附带的唯一问题是 Property
的类型为 Parent
。因此您不能调用特定于 Child1/Child2
的方法。这可以通过在 class RunningJob
:
上使用通用类型参数的约束来完成
public class RunningJob<TParent> where TParent : Parent
{
public TParent Property { get; set; }
}
因此,现在可以确保 Property
是 Parent
类型或任何派生类型。
一个选项...
public new IEnumerable<RequestBatch> GetBatches(...) {
get
{
return base.GetBatches(...).OfType<RequestBatch>();
}
}
另一个...
如果您不需要修改集合,那么只需将 List<T>
更改为 IEnumerable<T>
更多信息...
我有三个 class,其中两个继承自基础 class,第三个我想根据应用程序的状态引用另外两个中的一个。
public class Batch
{
public Batch() { }
}
public class RequestBatch : Batch
{
public RequestBatch(string batchJobType) : base(batchJobType) { }
public override int RecordCount
{
get { return Lines.Count; }
}
}
public class ResponseBatch : Batch
{
public ResponseBatch(string batchJobType) : base(batchJobType) { }
public ResponseBatch(int BatchJobRunID)
{ }
}
有时我有一个实例化的Child1实例,有时我需要Child2。但是,我有一个模型,我想传递我的应用程序以将所有内容保存在一个地方,但我想要一种方法来使包含 Child1 和 Child2 的 属性 通用,例如:
public class BatchJob {
public List<Batch> Batches { get; set; }
}
然后再这样做
public List<RequestBatch> GetBatches(...) {}
var BatchJob = new BatchJob();
BatchJob.Batches = GetBatches(...);
但是,编译器对我大吼大叫,说它不能将 Child1 隐式转换为(其基类型)Parent。
我在“= GetBatches(....”下看到红色波浪线,表示“无法将类型 'System.Collections.Generic.List' 隐式转换为 'System.Collections.Generic.List'
有没有一种方法可以泛化 属性 以便它可以采用任何父类型的抽象?
谢谢!
您显示的代码片段确实有效。没有编译错误:
class Program
{
static void Main()
{
var rj = new RunningJob();
rj.Property = new Child1();
rj.Property = new Child2();
}
}
public class RunningJob {
public Parent Property { get; set; }
}
public class Parent { }
public class Child1 : Parent { }
public class Child2 : Parent { }
此代码附带的唯一问题是 Property
的类型为 Parent
。因此您不能调用特定于 Child1/Child2
的方法。这可以通过在 class RunningJob
:
public class RunningJob<TParent> where TParent : Parent
{
public TParent Property { get; set; }
}
因此,现在可以确保 Property
是 Parent
类型或任何派生类型。
一个选项...
public new IEnumerable<RequestBatch> GetBatches(...) {
get
{
return base.GetBatches(...).OfType<RequestBatch>();
}
}
另一个...
如果您不需要修改集合,那么只需将 List<T>
更改为 IEnumerable<T>
更多信息...