【问题标题】:Converting from an interface to an object that implements the interface?从接口转换为实现接口的对象?
【发布时间】:2010-12-20 16:26:31
【问题描述】:

我有一个由几个不同对象实现的接口。我想做的是在 c# 中编写一个方法,该方法将接受接口对象作为参数并将此参数转换为它实现的对象,因此我不必为几种不同的类型编写相同的函数。如:

类 UnappliedCashDetails 实现接口 ITransactionDetail。

ISSBatch 的构造函数:

public ISSBatch(List<ITransactionDetail> details)

public static ISSBatch GetNextReceiptBatch() { List<UnappliedCashDetail> details = new List<UnappliedCashDetail>();

    /`*`some code here to populate my list`*`/            

    return = new ISSBatch(details);

}

C# 不喜欢这样。我是在尝试错误地使用界面还是没有正确投射?

谢谢!

【问题讨论】:

    标签: c#


    【解决方案1】:

    您将List<UnappliedCashDetail> 传递给接受List<ITransactionDetail> 的构造函数。 UnappliedCashDetail 可以很好地实现 ITransactionDetail,但是 C# 不支持这种类型的差异。考虑到在构造函数(或任何其他方法)中,您可以尝试将 SomeOtherTransactionDetail 的实例添加到您的详细信息列表中,除了详细信息列表应该真的只接受 UnappliedCashDetail,根据其宣言。

    要使您的代码正常工作,您需要更改您的声明

    List<ITransactionDetail> details = new List<ITransactionDetail>();      
    /* some code here to populate my list */                  
    return new ISSBatch(details);
    

    或者您可以简单地将您的构造函数更改为接受IEnumerable&lt;ITransactionDetail&gt;,在这种情况下您原来的List&lt;UnappliedCashDetail&gt; 声明将起作用。 IEnumerable&lt;T&gt; 支持方差(注意:C# 4),因为它只是一个序列,不能添加、删除等,因此不可能尝试将 AppliedCashDetail 实例添加到 @ 序列987654332@ 个对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-08
      • 2019-07-31
      • 1970-01-01
      • 2019-07-26
      • 1970-01-01
      • 2015-04-11
      • 1970-01-01
      相关资源
      最近更新 更多