转换列表<;oneType>;到IEnumerable<;另一种类型>;
本文关键字:gt lt 类型 另一种 IEnumerable oneType 列表 转换 | 更新日期: 2023-09-27 18:28:54
我有一个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; }
}
}
我应该如何进行转换?
生成一个类型到另一个类型的一对一投影的常见方法是执行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>();