通用c#属性类型

时间:2016-02-17 19:23:00

标签: c# abstraction

我有三个类,其中两个继承自基类,第三个我想引用另外两个中的一个,具体取决于应用程序的状态。

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。

我在&#34; = GetBatches(....&#34;说&#34;无法隐式转换类型&#39; System.Collections.Generic.List&#39;到&#39; ; System.Collections.Generic.List&#39;

有没有办法对属性进行生成,以便它可以采用Parent类型的任何摘要?

谢谢!

2 个答案:

答案 0 :(得分:1)

代码剪断你显示的确有效。没有编译器错误:

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的方法。这可以使用类RunningJob上的泛型类型参数的约束来完成:

public class RunningJob<TParent> where TParent : Parent
{
    public TParent Property { get; set; }
}

因此,现在确保Property属于Parent类型或任何派生类型。

答案 1 :(得分:0)

一个选项......

public new IEnumerable<RequestBatch> GetBatches(...) {
    get 
    {
        return base.GetBatches(...).OfType<RequestBatch>();
    }
}

<强>另一个...

如果您不需要修改收藏品,只需从List<T>更改为IEnumerable<T>

更多信息......