我有一个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; }
}
}
我该如何进行转换?
答案 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>();