将List <one type>转换为IEnumerable <another type> </another type> </onetype>

时间:2014-11-03 20:56:31

标签: c# linq c#-4.0 type-conversion ienumerable

我有一个listAdoParams List<AdoNetAppenderParameter>

AdoNetAppenderParameter log4net 库中的一种类型。

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; }
     }
}

我该如何进行转换?

1 个答案:

答案 0 :(得分:1)

生成一种类型与另一种类型的一对一投影的常用方法是执行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>();