转换列表<;oneType>;到IEnumerable<;另一种类型>;

本文关键字:gt lt 类型 另一种 IEnumerable oneType 列表 转换 | 更新日期: 2023-09-27 18:28:54

我有一个listAdoParams,它是List<AdoNetAppenderParameter>

AdoNetAppenderParameterlog4net库中的一个类型。

namespace log4net.Appender
{
  public class AdoNetAppenderParameter
    {
    public AdoNetAppenderParameter();
    public DbType DbType { get; set; }
    public IRawLayout Layout { get; set; }
    public string ParameterName { get; set; }
    public byte Precision { get; set; }
    public byte Scale { get; set; }
    public int Size { get; set; }
    public virtual void FormatValue(IDbCommand command, LoggingEvent loggingEvent);
    public virtual void Prepare(IDbCommand command);
    }
}

我想把这个listAdoParams转换成IEnumerable<IDataParameter>

namespace System.Data
{
  public interface IDataParameter
    {
    DbType DbType { get; set; }
    ParameterDirection Direction { get; set; }
    bool IsNullable { get; }
    string ParameterName { get; set; }
    string SourceColumn { get; set; }
    DataRowVersion SourceVersion { get; set; }
    object Value { get; set; }
     }
}

我应该如何进行转换?

转换列表<;oneType>;到IEnumerable<;另一种类型>;

生成一个类型到另一个类型的一对一投影的常见方法是执行Select。如果新类型是接口,则必须首先实现该接口:

class MyDataParameter : IDataParameter {
    DbType DbType { get; set; }
    ParameterDirection Direction { get; set; }
    bool IsNullable { get; }
    string ParameterName { get; set; }
    string SourceColumn { get; set; }
    DataRowVersion SourceVersion { get; set; }
    object Value { get; set; }
}
var res = initial.Select(
    p => new MyDataParameter {
        DbType = p.DbType
    ,   ParameterName = p.ParameterName
    ,   ... // and so on
    }
).Cast<IDataParameter>();

另一种方法是将AdoNetAppenderParameter封装在MyDataParameter:的实例中

class MyDataParameter : IDataParameter {
    private readonly AdoNetAppenderParameter wrapped;
    public MyDataParameter (AdoNetAppenderParameter w) {
        wrapped = w;
    }
    DbType DbType {
        get { return wrapped.DbType; }
        set { wrapped.DbType = value; }
    }
    ... // And so on
}

现在投影看起来会更简单:

var res = initial.Select(p => new MyDataParameter(p)).Cast<IDataParameter>();